Release 2.0.30 (#4225)

This commit is contained in:
Kevin Papst
2023-08-16 18:20:14 +02:00
committed by GitHub
parent c7bc8fae73
commit adc0779912
21 changed files with 860 additions and 520 deletions

View File

@@ -9,10 +9,8 @@
namespace App\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
#[\Attribute(\Attribute::TARGET_CLASS)]
final class TimesheetDeactivated extends Constraint
final class TimesheetDeactivated extends TimesheetConstraint
{
public const DISABLED_ACTIVITY_ERROR = 'kimai-timesheet-deactivated-activity';
public const DISABLED_PROJECT_ERROR = 'kimai-timesheet-deactivated-project';

View File

@@ -9,15 +9,18 @@
namespace App\Validator\Constraints;
#[\Attribute(\Attribute::TARGET_CLASS)]
final class TimesheetFutureTimes extends TimesheetConstraint
{
public const BEGIN_IN_FUTURE_ERROR = 'kimai-timesheet-future-times-01';
public const END_IN_FUTURE_ERROR = 'kimai-timesheet-future-times-02';
protected const ERROR_NAMES = [
self::BEGIN_IN_FUTURE_ERROR => 'The begin date cannot be in the future.',
self::END_IN_FUTURE_ERROR => 'The end date cannot be in the future.',
];
public string $message = 'The begin date cannot be in the future.';
public string $message = 'The date cannot be in the future.';
public function getTargets(): string|array
{

View File

@@ -22,33 +22,44 @@ final class TimesheetFutureTimesValidator extends ConstraintValidator
}
/**
* @param TimesheetEntity $timesheet
* @param TimesheetEntity $value
* @param Constraint $constraint
*/
public function validate(mixed $timesheet, Constraint $constraint): void
public function validate(mixed $value, Constraint $constraint): void
{
if (!($constraint instanceof TimesheetFutureTimes)) {
throw new UnexpectedTypeException($constraint, TimesheetFutureTimes::class);
}
if (!\is_object($timesheet) || !($timesheet instanceof TimesheetEntity)) {
throw new UnexpectedTypeException($timesheet, TimesheetEntity::class);
if (!\is_object($value) || !($value instanceof TimesheetEntity)) {
throw new UnexpectedTypeException($value, TimesheetEntity::class);
}
if ($this->configuration->isTimesheetAllowFutureTimes()) {
return;
}
$now = new \DateTime('now', $timesheet->getBegin()->getTimezone());
$now = new \DateTime('now', $value->getBegin()->getTimezone());
// allow configured default rounding time + 1 minute - see #1295
$allowedDiff = ($this->configuration->getTimesheetDefaultRoundingBegin() * 60) + 60;
if (($now->getTimestamp() + $allowedDiff) < $timesheet->getBegin()->getTimestamp()) {
$this->context->buildViolation('The begin date cannot be in the future.')
$nowTs = $now->getTimestamp() + $allowedDiff;
if ($value->getBegin() !== null && $nowTs < $value->getBegin()->getTimestamp()) {
$this->context->buildViolation(TimesheetFutureTimes::getErrorName(TimesheetFutureTimes::BEGIN_IN_FUTURE_ERROR))
->atPath('begin_date')
->setTranslationDomain('validators')
->setCode(TimesheetFutureTimes::BEGIN_IN_FUTURE_ERROR)
->addViolation();
}
$allowedDiff = ($this->configuration->getTimesheetDefaultRoundingEnd() * 60) + 60;
$nowTs = $now->getTimestamp() + $allowedDiff;
if ($value->getEnd() !== null && $nowTs < $value->getEnd()->getTimestamp()) {
$this->context->buildViolation(TimesheetFutureTimes::getErrorName(TimesheetFutureTimes::END_IN_FUTURE_ERROR))
->atPath('end_time')
->setTranslationDomain('validators')
->setCode(TimesheetFutureTimes::END_IN_FUTURE_ERROR)
->addViolation();
}
}
}