fix daterange filter for multi-timezone setups (#1321)
This commit is contained in:
@@ -70,18 +70,10 @@ class DoctrineCompilerPass implements CompilerPassInterface
|
||||
$engine = $this->findEngine();
|
||||
|
||||
$configDir = realpath(
|
||||
$container->getParameter('kernel.project_dir') . '/vendor/beberlei/doctrineextensions/config/'
|
||||
$container->getParameter('kernel.project_dir') . '/config/packages/doctrine/'
|
||||
);
|
||||
|
||||
if (!file_exists($configDir)) {
|
||||
@trigger_error('Using deprecated doctrine extensions config directory', E_USER_DEPRECATED);
|
||||
|
||||
$configDir = realpath(
|
||||
$container->getParameter('kernel.project_dir') . '/vendor/beberlei/DoctrineExtensions/config/'
|
||||
);
|
||||
}
|
||||
|
||||
$configFile = $configDir . '/' . $engine . '.yml';
|
||||
$configFile = $configDir . '/' . $engine . '.yaml';
|
||||
|
||||
if (!file_exists($configFile)) {
|
||||
throw new \Exception('Could not find config file for database engine. Looked at ' . $configFile);
|
||||
|
||||
57
src/Doctrine/Query/Sqlite/ConvertTz.php
Normal file
57
src/Doctrine/Query/Sqlite/ConvertTz.php
Normal file
@@ -0,0 +1,57 @@
|
||||
<?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\Doctrine\Query\Sqlite;
|
||||
|
||||
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
|
||||
use Doctrine\ORM\Query\Lexer;
|
||||
use Doctrine\ORM\Query\Parser;
|
||||
use Doctrine\ORM\Query\SqlWalker;
|
||||
|
||||
/**
|
||||
* This is just a fake, as SQLITE does not support this by now.
|
||||
*/
|
||||
class ConvertTz extends FunctionNode
|
||||
{
|
||||
protected $dateExpression;
|
||||
|
||||
protected $fromTz;
|
||||
|
||||
protected $toTz;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getSql(SqlWalker $sqlWalker)
|
||||
{
|
||||
$fieldName = $sqlWalker->walkArithmeticExpression($this->dateExpression);
|
||||
$fromTz = $sqlWalker->walkStringPrimary($this->fromTz);
|
||||
$toTz = $sqlWalker->walkStringPrimary($this->toTz);
|
||||
|
||||
return sprintf('%s', $fieldName);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function parse(Parser $parser)
|
||||
{
|
||||
$parser->match(Lexer::T_IDENTIFIER);
|
||||
$parser->match(Lexer::T_OPEN_PARENTHESIS);
|
||||
|
||||
$this->dateExpression = $parser->ArithmeticExpression();
|
||||
$parser->match(Lexer::T_COMMA);
|
||||
|
||||
$this->fromTz = $parser->StringPrimary();
|
||||
$parser->match(Lexer::T_COMMA);
|
||||
|
||||
$this->toTz = $parser->StringPrimary();
|
||||
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
|
||||
}
|
||||
}
|
||||
@@ -218,14 +218,14 @@ class TimesheetRepository extends EntityRepository
|
||||
|
||||
if (!empty($begin)) {
|
||||
$qb
|
||||
->andWhere($qb->expr()->gt('t.begin', ':from'))
|
||||
->setParameter('from', $begin, Type::DATETIME);
|
||||
->andWhere($qb->expr()->gte($this->getDatetimeFieldSql('t.begin'), ':from'))
|
||||
->setParameter('from', $begin);
|
||||
}
|
||||
|
||||
if (!empty($end)) {
|
||||
$qb
|
||||
->andWhere($qb->expr()->lt('t.end', ':to'))
|
||||
->setParameter('to', $end, Type::DATETIME);
|
||||
->andWhere($qb->expr()->lte($this->getDatetimeFieldSql('t.end'), ':to'))
|
||||
->setParameter('to', $end);
|
||||
}
|
||||
|
||||
if (null !== $user) {
|
||||
@@ -285,15 +285,15 @@ class TimesheetRepository extends EntityRepository
|
||||
;
|
||||
|
||||
if (!empty($begin)) {
|
||||
$qb->where($qb->expr()->gt('t.begin', ':from'));
|
||||
$qb->setParameter('from', $begin, Type::DATETIME);
|
||||
$qb->andWhere($qb->expr()->gte($this->getDatetimeFieldSql('t.begin'), ':from'))
|
||||
->setParameter('from', $begin);
|
||||
} else {
|
||||
$qb->where($qb->expr()->isNotNull('t.begin'));
|
||||
$qb->andWhere($qb->expr()->isNotNull('t.begin'));
|
||||
}
|
||||
|
||||
if (!empty($end)) {
|
||||
$qb->andWhere($qb->expr()->lt('t.end', ':to'))
|
||||
->setParameter('to', $end, Type::DATETIME);
|
||||
$qb->andWhere($qb->expr()->lte($this->getDatetimeFieldSql('t.end'), ':to'))
|
||||
->setParameter('to', $end);
|
||||
} else {
|
||||
$qb->andWhere($qb->expr()->isNotNull('t.end'));
|
||||
}
|
||||
@@ -674,7 +674,7 @@ class TimesheetRepository extends EntityRepository
|
||||
}
|
||||
|
||||
if (null !== $query->getBegin()) {
|
||||
$qb->andWhere('t.begin >= :begin')
|
||||
$qb->andWhere($qb->expr()->gte($this->getDatetimeFieldSql('t.begin'), ':begin'))
|
||||
->setParameter('begin', $query->getBegin());
|
||||
}
|
||||
|
||||
@@ -685,7 +685,7 @@ class TimesheetRepository extends EntityRepository
|
||||
}
|
||||
|
||||
if (null !== $query->getEnd()) {
|
||||
$qb->andWhere('t.begin <= :end')
|
||||
$qb->andWhere($qb->expr()->lte($this->getDatetimeFieldSql('t.begin'), ':end'))
|
||||
->setParameter('end', $query->getEnd());
|
||||
}
|
||||
|
||||
@@ -782,7 +782,7 @@ class TimesheetRepository extends EntityRepository
|
||||
}
|
||||
|
||||
if (null !== $startFrom) {
|
||||
$qb->andWhere($qb->expr()->gt('t.begin', ':begin'))
|
||||
$qb->andWhere($qb->expr()->gte($this->getDatetimeFieldSql('t.begin'), ':begin'))
|
||||
->setParameter('begin', $startFrom);
|
||||
}
|
||||
|
||||
@@ -824,4 +824,9 @@ class TimesheetRepository extends EntityRepository
|
||||
|
||||
$em->commit();
|
||||
}
|
||||
|
||||
private function getDatetimeFieldSql(string $field): string
|
||||
{
|
||||
return sprintf('CONVERT_TZ(%s, \'UTC\', t.timezone)', $field);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user