Skip to content

Add --begin/--end and --timezone to start - #36

Open
parthitce wants to merge 1 commit into
kimai:masterfrom
linumiz:dev/add-begin-end-tz
Open

parthitce wants to merge 1 commit into
kimai:masterfrom
linumiz:dev/add-begin-end-tz

Conversation

@parthitce

Copy link
Copy Markdown

Allow creating timesheet records with explicit begin/end times, and a -z/--timezone to name the IANA zone used to read them (falls back to the PHP default). Invalid zone fails cleanly without entering the refine prompt.

Co-authored-by: webemerge office@web-emerge.com
Signed-off-by: webemerge office@web-emerge.com
Signed-off-by: Parthiban Nallathambi parthiban@linumiz.com

Comment thread src/Command/TimesheetCommandTrait.php Outdated
Comment on lines +337 to +342
return $this->parseAndRefineDateTime(
$io,
$io->ask(\sprintf('Value "%s" for field "%s" is not a valid DateTime. Please refine:', $value, $valueName), $value),
$valueName,
$timezone,
);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know this was in the original PR, but I would propose to use something like this instead (untested code!)

$io->error((\sprintf('Value "%s" for field "%s" is not a valid DateTime.', $value, $valueName));
return Command::ERROR;

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed and tested. Thanks for the review.

@parthitce

Copy link
Copy Markdown
Author

@kevinpapst Please revisit and thanks

@kevinpapst
kevinpapst self-requested a review September 22, 2026 18:57

@kevinpapst kevinpapst left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for owning the PR and taking over!

Comment thread src/Command/StartCommand.php Outdated
$form->setDescription($description);
}

$timezone = $input->getOption('timezone');

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Timezone: is only validated if either begin or end are passed. always execute the resolveTimezone() - otherwise the user won't recognize some broken value (e.g. --timezone=foo would be silently ignored currently).

Add a try & catch and show an error + Command::FAILURE if parsing fails

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. The timezone is now always validated, and an invalid one fails with an error and Command::FAILURE.

Comment thread src/Command/TimesheetCommandTrait.php Outdated
return null;
}

private function parseAndRefineDateTime(string $value, string $valueName, ?string $timezone = null): \DateTime

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

parseAndRefineDateTime() should be renamed to parseDateTime()

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Renamed to parseDateTime

Comment thread src/Command/StartCommand.php Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The message still says "Started timesheet" when the record is already ended.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed. It now says "Created timesheet" when an end is set.

Comment thread src/Command/StartCommand.php Outdated
Comment on lines +96 to +99
if (null !== ($end = $input->getOption('end'))) {
$end = $this->parseAndRefineDateTime((string) $end, 'end', $timezone);
$form->setEnd($end);
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

two issues:

  • end could be before begin: this is validated in Kimai, but we should catch it early here
  • end could be passed without begin, which shouldn't be possible

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both are now rejected before any API call: --end requires --begin, and end must not be earlier than begin.

Allow creating timesheet records with explicit begin/end times, and a
-z/--timezone to name the IANA zone used to read them (falls back to the
PHP default). Invalid zone fails cleanly without entering the refine prompt.

Co-authored-by: webemerge <office@web-emerge.com>
Signed-off-by: webemerge <office@web-emerge.com>
Signed-off-by: Parthiban Nallathambi <parthiban@linumiz.com>
@parthitce
parthitce force-pushed the dev/add-begin-end-tz branch from 6c99e23 to 91943c7 Compare October 20, 2026 16:19
@parthitce

Copy link
Copy Markdown
Author

Thanks for owning the PR and taking over!

Also fixed a phpstan level-7 error: the getEnd()?-> nullsafe call is now an explicit null check. Please revisit.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants