diff --git a/app/Service/Import/Importers/ClockifyTimeEntriesImporter.php b/app/Service/Import/Importers/ClockifyTimeEntriesImporter.php index bee9cf1c..de04a5d3 100644 --- a/app/Service/Import/Importers/ClockifyTimeEntriesImporter.php +++ b/app/Service/Import/Importers/ClockifyTimeEntriesImporter.php @@ -6,6 +6,7 @@ namespace App\Service\Import\Importers; use App\Enums\Role; use App\Models\TimeEntry; +use Carbon\Exceptions\InvalidFormatException; use Exception; use Illuminate\Support\Carbon; use League\Csv\Exception as CsvException; @@ -106,10 +107,14 @@ class ClockifyTimeEntriesImporter extends DefaultImporter $timeEntry->tags = $this->getTags($record['Tags']); // Start - if (preg_match('/^[0-9]{1,2}:[0-9]{1,2} (AM|PM)$/', $record['Start Time']) === 1) { - $start = Carbon::createFromFormat('m/d/Y h:i A', $record['Start Date'].' '.$record['Start Time'], $timezone); - } else { - $start = Carbon::createFromFormat('m/d/Y H:i:s A', $record['Start Date'].' '.$record['Start Time'], $timezone); + try { + if (preg_match('/^[0-9]{1,2}:[0-9]{1,2} (AM|PM)$/', $record['Start Time']) === 1) { + $start = Carbon::createFromFormat('m/d/Y h:i A', $record['Start Date'].' '.$record['Start Time'], $timezone); + } else { + $start = Carbon::createFromFormat('m/d/Y H:i:s A', $record['Start Date'].' '.$record['Start Time'], $timezone); + } + } catch (InvalidFormatException) { + throw new ImportException('Start date ("'.$record['Start Date'].'") or time ("'.$record['Start Time'].'") are invalid'); } if ($start === null) { throw new ImportException('Start date ("'.$record['Start Date'].'") or time ("'.$record['Start Time'].'") are invalid'); @@ -117,10 +122,14 @@ class ClockifyTimeEntriesImporter extends DefaultImporter $timeEntry->start = $start; // End - if (preg_match('/^[0-9]{1,2}:[0-9]{1,2} (AM|PM)$/', $record['End Time']) === 1) { - $end = Carbon::createFromFormat('m/d/Y h:i A', $record['End Date'].' '.$record['End Time'], $timezone); - } else { - $end = Carbon::createFromFormat('m/d/Y H:i:s A', $record['End Date'].' '.$record['End Time'], $timezone); + try { + if (preg_match('/^[0-9]{1,2}:[0-9]{1,2} (AM|PM)$/', $record['End Time']) === 1) { + $end = Carbon::createFromFormat('m/d/Y h:i A', $record['End Date'].' '.$record['End Time'], $timezone); + } else { + $end = Carbon::createFromFormat('m/d/Y H:i:s A', $record['End Date'].' '.$record['End Time'], $timezone); + } + } catch (InvalidFormatException) { + throw new ImportException('End date ("'.$record['End Date'].'") or time ("'.$record['End Time'].'") are invalid'); } if ($end === null) { throw new ImportException('End date ("'.$record['End Date'].'") or time ("'.$record['End Time'].'") are invalid'); diff --git a/app/Service/Import/Importers/TogglTimeEntriesImporter.php b/app/Service/Import/Importers/TogglTimeEntriesImporter.php index 21b3f888..208cca89 100644 --- a/app/Service/Import/Importers/TogglTimeEntriesImporter.php +++ b/app/Service/Import/Importers/TogglTimeEntriesImporter.php @@ -6,6 +6,7 @@ namespace App\Service\Import\Importers; use App\Enums\Role; use App\Models\TimeEntry; +use Carbon\Exceptions\InvalidFormatException; use Exception; use Illuminate\Support\Carbon; use League\Csv\Exception as CsvException; @@ -101,12 +102,21 @@ class TogglTimeEntriesImporter extends DefaultImporter } $timeEntry->billable = $record['Billable'] === 'Yes'; $timeEntry->tags = $this->getTags($record['Tags']); - $start = Carbon::createFromFormat('Y-m-d H:i:s', $record['Start date'].' '.$record['Start time'], $timezone); + try { + $start = Carbon::createFromFormat('Y-m-d H:i:s', $record['Start date'].' '.$record['Start time'], $timezone); + } catch (InvalidFormatException) { + throw new ImportException('Start date ("'.$record['Start date'].'") or time ("'.$record['Start time'].'") are invalid'); + } if ($start === null) { throw new ImportException('Start date ("'.$record['Start date'].'") or time ("'.$record['Start time'].'") are invalid'); } $timeEntry->start = $start; - $end = Carbon::createFromFormat('Y-m-d H:i:s', $record['End date'].' '.$record['End time'], $timezone); + + try { + $end = Carbon::createFromFormat('Y-m-d H:i:s', $record['End date'].' '.$record['End time'], $timezone); + } catch (InvalidFormatException) { + throw new ImportException('End date ("'.$record['End date'].'") or time ("'.$record['End time'].'") are invalid'); + } if ($end === null) { throw new ImportException('End date ("'.$record['End date'].'") or time ("'.$record['End time'].'") are invalid'); } diff --git a/lang/en/importer.php b/lang/en/importer.php index b546ad46..d0e539fa 100644 --- a/lang/en/importer.php +++ b/lang/en/importer.php @@ -5,10 +5,12 @@ declare(strict_types=1); return [ 'clockify_time_entries' => [ 'name' => 'Clockify Time Entries', - 'description' => 'Go to REPORTS -> TIME -> Detailed in the navigation on the left. '. + 'description' => 'First make sure that you set the Date format to "MM/DD/YYYY" and the Time format to "12-hour" in the user settings. '. + 'Go to REPORTS -> TIME -> Detailed in the navigation on the left. '. 'Now select the date range that you want to export in the right top. '. - 'It is currently not possible to select more than one year. You can export each year seperatly and import them one after another.'. - 'Now click Export -> Save as CSV. The Export dropdown is in the header of the export table left of the printer symbol.', + 'It is currently not possible to select more than one year. You can export each year separately and import them one after another .'. + 'Now click Export -> Save as CSV. The Export dropdown is in the header of the export table left of the printer symbol. '. + 'Before you import make sure that the Timezone settings in Clockify are the same as in solidtime.', ], 'clockify_projects' => [ 'name' => 'Clockify Projects', @@ -27,6 +29,7 @@ return [ 'toggl_time_entries' => [ 'name' => 'Toggl Time Entries', 'description' => 'Important: If you want to import a Toggl organization use the "Toggl Data Importer" before using this importer, since this export contains more details. '. - 'Go to Admin -> Settings -> Data export. Under "Time entries" select the year you want to export and click on "Export time entries". You can export all years one after another and import them one after another.', + 'Go to Admin -> Settings -> Data export. Under "Time entries" select the year you want to export and click on "Export time entries". You can export all years one after another and import them one after another. '. + 'Before you import make sure that the Timezone settings in Toggl are the same as in solidtime.', ], ];