validation for future and negative times (#512)

This commit is contained in:
Kevin Papst
2019-01-21 01:51:57 +01:00
committed by GitHub
parent 5b1ec1eb8f
commit 5539f68a54
6 changed files with 44 additions and 6 deletions

View File

@@ -25,6 +25,7 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface;
* ) * )
* @ORM\Entity(repositoryClass="App\Repository\TimesheetRepository") * @ORM\Entity(repositoryClass="App\Repository\TimesheetRepository")
* @ORM\HasLifecycleCallbacks() * @ORM\HasLifecycleCallbacks()
* @Assert\Callback("validate")
*/ */
class Timesheet class Timesheet
{ {
@@ -163,9 +164,9 @@ class Timesheet
{ {
$this->end = $end; $this->end = $end;
// FIXME test and then remove it, this should not be neccessary
if (null === $end) { if (null === $end) {
$this->duration = 0; $this->duration = 0;
$this->rate = 0;
} }
return $this; return $this;
@@ -345,12 +346,8 @@ class Timesheet
} }
/** /**
* These validations are used in places, where we don't use a form yet (like the API).
*
* @param ExecutionContextInterface $context * @param ExecutionContextInterface $context
* @param mixed $payload * @param $payload
*
* @Assert\Callback
*/ */
public function validate(ExecutionContextInterface $context, $payload) public function validate(ExecutionContextInterface $context, $payload)
{ {
@@ -411,5 +408,13 @@ class Timesheet
->setTranslationDomain('validators') ->setTranslationDomain('validators')
->addViolation(); ->addViolation();
} }
if (time() < $this->getBegin()->getTimestamp()) {
$context->buildViolation('The begin date cannot be in the future.')
->atPath('begin')
->setTranslationDomain('validators')
->addViolation();
}
} }
} }

View File

@@ -38,6 +38,7 @@ class RateCalculator implements CalculatorInterface
public function calculate(Timesheet $record) public function calculate(Timesheet $record)
{ {
if (null === $record->getEnd()) { if (null === $record->getEnd()) {
$record->setRate(0);
return; return;
} }

View File

@@ -196,6 +196,10 @@ class Extensions extends \Twig_Extension
} }
} }
if ($seconds < 0) {
return '?';
}
$locale = $this->getLocale(); $locale = $this->getLocale();
switch ($format) { switch ($format) {
case 'full': case 'full':

View File

@@ -47,6 +47,8 @@ class ActivityInvoiceCalculatorTest extends AbstractCalculatorTest
$timesheet = new Timesheet(); $timesheet = new Timesheet();
$timesheet $timesheet
->setBegin(new \DateTime())
->setEnd(new \DateTime())
->setDuration(3600) ->setDuration(3600)
->setRate(293.27) ->setRate(293.27)
->setUser($user) ->setUser($user)
@@ -55,6 +57,8 @@ class ActivityInvoiceCalculatorTest extends AbstractCalculatorTest
$timesheet2 = new Timesheet(); $timesheet2 = new Timesheet();
$timesheet2 $timesheet2
->setBegin(new \DateTime())
->setEnd(new \DateTime())
->setDuration(400) ->setDuration(400)
->setRate(84.75) ->setRate(84.75)
->setUser($user) ->setUser($user)
@@ -63,6 +67,8 @@ class ActivityInvoiceCalculatorTest extends AbstractCalculatorTest
$timesheet3 = new Timesheet(); $timesheet3 = new Timesheet();
$timesheet3 $timesheet3
->setBegin(new \DateTime())
->setEnd(new \DateTime())
->setDuration(1800) ->setDuration(1800)
->setRate(111.11) ->setRate(111.11)
->setUser($user) ->setUser($user)
@@ -71,6 +77,8 @@ class ActivityInvoiceCalculatorTest extends AbstractCalculatorTest
$timesheet4 = new Timesheet(); $timesheet4 = new Timesheet();
$timesheet4 $timesheet4
->setBegin(new \DateTime())
->setEnd(new \DateTime())
->setDuration(400) ->setDuration(400)
->setRate(1947.99) ->setRate(1947.99)
->setUser($user) ->setUser($user)
@@ -79,6 +87,8 @@ class ActivityInvoiceCalculatorTest extends AbstractCalculatorTest
$timesheet5 = new Timesheet(); $timesheet5 = new Timesheet();
$timesheet5 $timesheet5
->setBegin(new \DateTime())
->setEnd(new \DateTime())
->setDuration(400) ->setDuration(400)
->setRate(84) ->setRate(84)
->setUser(new User()) ->setUser(new User())

View File

@@ -47,6 +47,8 @@ class UserInvoiceCalculatorTest extends AbstractCalculatorTest
$timesheet = new Timesheet(); $timesheet = new Timesheet();
$timesheet $timesheet
->setBegin(new \DateTime())
->setEnd(new \DateTime())
->setDuration(3600) ->setDuration(3600)
->setRate(293.27) ->setRate(293.27)
->setUser($user1) ->setUser($user1)
@@ -55,6 +57,8 @@ class UserInvoiceCalculatorTest extends AbstractCalculatorTest
$timesheet2 = new Timesheet(); $timesheet2 = new Timesheet();
$timesheet2 $timesheet2
->setBegin(new \DateTime())
->setEnd(new \DateTime())
->setDuration(400) ->setDuration(400)
->setRate(84.75) ->setRate(84.75)
->setUser($user2) ->setUser($user2)
@@ -63,6 +67,8 @@ class UserInvoiceCalculatorTest extends AbstractCalculatorTest
$timesheet3 = new Timesheet(); $timesheet3 = new Timesheet();
$timesheet3 $timesheet3
->setBegin(new \DateTime())
->setEnd(new \DateTime())
->setDuration(1800) ->setDuration(1800)
->setRate(111.11) ->setRate(111.11)
->setUser($user1) ->setUser($user1)
@@ -71,6 +77,8 @@ class UserInvoiceCalculatorTest extends AbstractCalculatorTest
$timesheet4 = new Timesheet(); $timesheet4 = new Timesheet();
$timesheet4 $timesheet4
->setBegin(new \DateTime())
->setEnd(new \DateTime())
->setDuration(400) ->setDuration(400)
->setRate(1947.99) ->setRate(1947.99)
->setUser($user2) ->setUser($user2)
@@ -79,6 +87,8 @@ class UserInvoiceCalculatorTest extends AbstractCalculatorTest
$timesheet5 = new Timesheet(); $timesheet5 = new Timesheet();
$timesheet5 $timesheet5
->setBegin(new \DateTime())
->setEnd(new \DateTime())
->setDuration(400) ->setDuration(400)
->setRate(84) ->setRate(84)
->setUser(new User()) ->setUser(new User())

View File

@@ -160,6 +160,14 @@ class ExtensionsTest extends TestCase
// test fallback format // test fallback format
$sut = $this->getSut($this->localeEn, 'XX'); $sut = $this->getSut($this->localeEn, 'XX');
$this->assertEquals('02:37 h', $sut->duration($record->getDuration())); $this->assertEquals('02:37 h', $sut->duration($record->getDuration()));
// test negative duratiobn
$sut = $this->getSut($this->localeEn, 'XX');
$this->assertEquals('?', $sut->duration('-1'));
// test zero duration
$sut = $this->getSut($this->localeEn, 'XX');
$this->assertEquals('00:00 h', $sut->duration('0'));
} }
protected function getTimesheet($seconds) protected function getTimesheet($seconds)