validation for future and negative times (#512)
This commit is contained in:
@@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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':
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user