respect project start and end dates in quick-entry form (#3642)

This commit is contained in:
Kevin Papst
2022-11-21 19:07:33 +01:00
committed by GitHub
parent 4f698f73dc
commit d6c15bb1cb
7 changed files with 110 additions and 79 deletions

View File

@@ -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);
}
}