respect project start and end dates in quick-entry form (#3642)
This commit is contained in:
@@ -12,7 +12,6 @@ namespace App\Controller;
|
||||
use App\Configuration\SystemConfiguration;
|
||||
use App\Entity\Timesheet;
|
||||
use App\Form\QuickEntryForm;
|
||||
use App\Model\QuickEntryModel;
|
||||
use App\Model\QuickEntryWeek;
|
||||
use App\Repository\Query\TimesheetQuery;
|
||||
use App\Repository\TimesheetRepository;
|
||||
@@ -111,6 +110,11 @@ class QuickEntryController extends AbstractController
|
||||
if (\array_key_exists($id, $rows)) {
|
||||
continue;
|
||||
}
|
||||
// there is an edge case possible with a project that starts and ends between the start and end date
|
||||
// user could still select it from the dropdown, but it is better to hide a row than displaying already ended projects
|
||||
if (!$timesheet->getProject()->isVisibleAtDate($startWeek) && !$timesheet->getProject()->isVisibleAtDate($endWeek)) {
|
||||
continue;
|
||||
}
|
||||
$rows[$id] = [
|
||||
'days' => $week,
|
||||
'project' => $timesheet->getProject(),
|
||||
@@ -123,13 +127,13 @@ class QuickEntryController extends AbstractController
|
||||
$defaultMinute = (int) $defaultBegin->format('i');
|
||||
$defaultBegin->setTime($defaultHour, $defaultMinute, 0, 0);
|
||||
|
||||
// fill all rows and columns to make sure we do not have missing records
|
||||
/** @var QuickEntryModel[] $models */
|
||||
$models = [];
|
||||
$formModel = new QuickEntryWeek($startWeek);
|
||||
|
||||
foreach ($rows as $id => $row) {
|
||||
$model = new QuickEntryModel($user, $row['project'], $row['activity']);
|
||||
$model = $formModel->addRow($user, $row['project'], $row['activity']);
|
||||
foreach ($row['days'] as $dayId => $day) {
|
||||
if (!\array_key_exists('entry', $day)) {
|
||||
// fill all rows and columns to make sure we do not have missing records
|
||||
$tmp = new Timesheet();
|
||||
$tmp->setUser($user);
|
||||
$tmp->setProject($row['project']);
|
||||
@@ -141,11 +145,11 @@ class QuickEntryController extends AbstractController
|
||||
$model->addTimesheet($day['entry']);
|
||||
}
|
||||
}
|
||||
$models[] = $model;
|
||||
}
|
||||
|
||||
// create prototype model
|
||||
$empty = new QuickEntryModel($user);
|
||||
$empty = $formModel->createRow($user);
|
||||
$empty->markAsPrototype();
|
||||
foreach ($week as $dayId => $day) {
|
||||
$tmp = new Timesheet();
|
||||
$tmp->setUser($user);
|
||||
@@ -156,10 +160,10 @@ class QuickEntryController extends AbstractController
|
||||
|
||||
// add empty rows for simpler starting
|
||||
$minRows = \intval($this->configuration->find('quick_entry.minimum_rows'));
|
||||
if (\count($models) < $minRows) {
|
||||
$newRows = $minRows - \count($models);
|
||||
if ($formModel->countRows() < $minRows) {
|
||||
$newRows = $minRows - $formModel->countRows();
|
||||
for ($a = 0; $a < $newRows; $a++) {
|
||||
$model = new QuickEntryModel();
|
||||
$model = $formModel->addRow($user);
|
||||
foreach ($week as $dayId => $day) {
|
||||
$tmp = new Timesheet();
|
||||
$tmp->setUser($user);
|
||||
@@ -167,19 +171,14 @@ class QuickEntryController extends AbstractController
|
||||
$tmp->getBegin()->setTime($defaultHour, $defaultMinute, 0, 0);
|
||||
$model->addTimesheet($tmp);
|
||||
}
|
||||
|
||||
$models[] = $model;
|
||||
}
|
||||
}
|
||||
|
||||
// sort rows by projects - make it configurable in the future
|
||||
uasort($models, [$this, 'sortByProjectName']);
|
||||
|
||||
$formModel = new QuickEntryWeek($startWeek, $models);
|
||||
|
||||
$form = $this->createForm(QuickEntryForm::class, $formModel, [
|
||||
'timezone' => $this->getDateTimeFactory()->getTimezone()->getName(),
|
||||
'prototype_data' => $empty,
|
||||
'start_date' => $startWeek,
|
||||
'end_date' => $endWeek,
|
||||
]);
|
||||
|
||||
$form->handleRequest($request);
|
||||
@@ -194,7 +193,8 @@ class QuickEntryController extends AbstractController
|
||||
foreach ($data->getRows() as $tmpModel) {
|
||||
foreach ($tmpModel->getTimesheets() as $timesheet) {
|
||||
if ($timesheet->getId() !== null) {
|
||||
if ($timesheet->getDuration(false) === null || $timesheet->getEnd() === null) {
|
||||
$duration = $timesheet->getDuration(false);
|
||||
if ($duration === null || $timesheet->getEnd() === null) {
|
||||
$deleteTimesheets[] = $timesheet;
|
||||
} else {
|
||||
$saveTimesheets[] = $timesheet;
|
||||
@@ -235,16 +235,4 @@ class QuickEntryController extends AbstractController
|
||||
'form' => $form->createView(),
|
||||
]);
|
||||
}
|
||||
|
||||
private function sortByProjectName(QuickEntryModel $a, QuickEntryModel $b): int
|
||||
{
|
||||
$aName = $a->getProject() !== null ? $a->getProject()->getName() : null;
|
||||
$bName = $b->getProject() !== null ? $b->getProject()->getName() : null;
|
||||
|
||||
if ($aName === null || $bName === null) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return strcmp($aName, $bName);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user