Prevent bookings with same start / stop time (#3304)

This commit is contained in:
Lukas Steinmann
2022-05-17 11:12:08 +02:00
committed by GitHub
parent f409ce5364
commit 27c60d9fc4
15 changed files with 266 additions and 1 deletions

View File

@@ -0,0 +1,26 @@
<?php
/*
* This file is part of the Kimai time-tracking app.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Validator\Constraints;
final class TimesheetZeroDuration extends TimesheetConstraint
{
public const ZERO_DURATION_ERROR = 'kimai-timesheet-zero-duration-01';
protected static $errorNames = [
self::ZERO_DURATION_ERROR => 'Duration cannot be zero.',
];
public $message = 'Duration cannot be zero.';
public function getTargets()
{
return self::CLASS_CONSTRAINT;
}
}

View File

@@ -0,0 +1,56 @@
<?php
/*
* This file is part of the Kimai time-tracking app.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Validator\Constraints;
use App\Configuration\SystemConfiguration;
use App\Entity\Timesheet as TimesheetEntity;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
final class TimesheetZeroDurationValidator extends ConstraintValidator
{
/**
* @var SystemConfiguration
*/
private $configuration;
public function __construct(SystemConfiguration $configuration)
{
$this->configuration = $configuration;
}
/**
* @param TimesheetEntity $timesheet
* @param Constraint $constraint
*/
public function validate($timesheet, Constraint $constraint)
{
if (!($constraint instanceof TimesheetZeroDuration)) {
throw new UnexpectedTypeException($constraint, TimesheetZeroDuration::class);
}
if (!\is_object($timesheet) || !($timesheet instanceof TimesheetEntity)) {
throw new UnexpectedTypeException($timesheet, TimesheetEntity::class);
}
if ($this->configuration->isTimesheetAllowZeroDuration()) {
return;
}
if ($timesheet->getDuration() == 0) {
$this->context->buildViolation($constraint->message)
->atPath('duration')
->setTranslationDomain('validators')
->setCode(TimesheetZeroDuration::ZERO_DURATION_ERROR)
->addViolation();
}
}
}