diff --git a/src/Controller/Reporting/ReportUsersMonthController.php b/src/Controller/Reporting/ReportUsersMonthController.php index 55275568..1a08c625 100644 --- a/src/Controller/Reporting/ReportUsersMonthController.php +++ b/src/Controller/Reporting/ReportUsersMonthController.php @@ -63,10 +63,6 @@ final class ReportUsersMonthController extends AbstractController $currentUser = $this->getUser(); $dateTimeFactory = $this->getDateTimeFactory(); - $query = new UserQuery(); - $query->setCurrentUser($currentUser); - $allUsers = $userRepository->getUsersForQuery($query); - $values = new MonthlyUserList(); $values->setDate($dateTimeFactory->getStartOfMonth()); @@ -77,10 +73,21 @@ final class ReportUsersMonthController extends AbstractController $form->submit($request->query->all(), false); - if ($form->isSubmitted() && !$form->isValid()) { - $values->setDate($dateTimeFactory->getStartOfMonth()); + $query = new UserQuery(); + $query->setCurrentUser($currentUser); + + if ($form->isSubmitted()) { + if (!$form->isValid()) { + $values->setDate($dateTimeFactory->getStartOfMonth()); + } else { + if ($values->getTeam() !== null) { + $query->setSearchTeams([$values->getTeam()]); + } + } } + $allUsers = $userRepository->getUsersForQuery($query); + if ($values->getDate() === null) { $values->setDate($dateTimeFactory->getStartOfMonth()); } diff --git a/src/Controller/Reporting/ReportUsersWeekController.php b/src/Controller/Reporting/ReportUsersWeekController.php index 6d208db1..6fe04acb 100644 --- a/src/Controller/Reporting/ReportUsersWeekController.php +++ b/src/Controller/Reporting/ReportUsersWeekController.php @@ -63,10 +63,6 @@ final class ReportUsersWeekController extends AbstractController $currentUser = $this->getUser(); $dateTimeFactory = $this->getDateTimeFactory(); - $query = new UserQuery(); - $query->setCurrentUser($currentUser); - $allUsers = $userRepository->getUsersForQuery($query); - $values = new WeeklyUserList(); $values->setDate($dateTimeFactory->getStartOfWeek()); @@ -77,10 +73,21 @@ final class ReportUsersWeekController extends AbstractController $form->submit($request->query->all(), false); - if ($form->isSubmitted() && !$form->isValid()) { - $values->setDate($dateTimeFactory->getStartOfWeek()); + $query = new UserQuery(); + $query->setCurrentUser($currentUser); + + if ($form->isSubmitted()) { + if (!$form->isValid()) { + $values->setDate($dateTimeFactory->getStartOfWeek()); + } else { + if ($values->getTeam() !== null) { + $query->setSearchTeams([$values->getTeam()]); + } + } } + $allUsers = $userRepository->getUsersForQuery($query); + if ($values->getDate() === null) { $values->setDate($dateTimeFactory->getStartOfWeek()); } diff --git a/src/Controller/Reporting/ReportUsersYearController.php b/src/Controller/Reporting/ReportUsersYearController.php index 92e2d30e..fd271199 100644 --- a/src/Controller/Reporting/ReportUsersYearController.php +++ b/src/Controller/Reporting/ReportUsersYearController.php @@ -73,9 +73,6 @@ final class ReportUsersYearController extends AbstractController $currentUser = $this->getUser(); $dateTimeFactory = $this->getDateTimeFactory(); - $query = new UserQuery(); - $query->setCurrentUser($currentUser); - $allUsers = $userRepository->getUsersForQuery($query); $defaultDate = $dateTimeFactory->createStartOfYear(); if (null !== ($financialYear = $systemConfiguration->getFinancialYearStart())) { @@ -92,10 +89,21 @@ final class ReportUsersYearController extends AbstractController $form->submit($request->query->all(), false); - if ($form->isSubmitted() && !$form->isValid()) { - $values->setDate(clone $defaultDate); + $query = new UserQuery(); + $query->setCurrentUser($currentUser); + + if ($form->isSubmitted()) { + if (!$form->isValid()) { + $values->setDate(clone $defaultDate); + } else { + if ($values->getTeam() !== null) { + $query->setSearchTeams([$values->getTeam()]); + } + } } + $allUsers = $userRepository->getUsersForQuery($query); + if ($values->getDate() === null) { $values->setDate(clone $defaultDate); } diff --git a/src/Form/Extension/ToolbarFormExtension.php b/src/Form/Extension/ToolbarFormExtension.php new file mode 100644 index 00000000..17cebda6 --- /dev/null +++ b/src/Form/Extension/ToolbarFormExtension.php @@ -0,0 +1,88 @@ +userService = $userService; + $this->teamService = $teamService; + } + + public static function getExtendedTypes(): iterable + { + return [ + InvoiceToolbarForm::class, + InvoiceToolbarSimpleForm::class, + ExportToolbarForm::class, + TimesheetToolbarForm::class, + TimesheetExportToolbarForm::class, + UserToolbarForm::class, + WeeklyUserListForm::class, + MonthlyUserListForm::class, + YearlyUserListForm::class, + ]; + } + + public function buildForm(FormBuilderInterface $builder, array $options) + { + $deleteUser = false; + foreach ($this->userNames as $name) { + if ($builder->has($name) && $this->userService->countUser(true) < 2) { + $deleteUser = true; + break; + } + } + + if ($deleteUser) { + foreach ($this->userNames as $name) { + if ($builder->has($name)) { + $builder->remove($name); + } + } + } + + $deleteTeams = false; + foreach ($this->teamNames as $name) { + if ($builder->has($name) && !$this->teamService->hasTeams()) { + $deleteTeams = true; + break; + } + } + + if ($deleteTeams) { + foreach ($this->teamNames as $name) { + if ($builder->has($name)) { + $builder->remove($name); + } + } + } + } +} diff --git a/src/Form/Toolbar/ExportToolbarForm.php b/src/Form/Toolbar/ExportToolbarForm.php index da2f5b57..283e8776 100644 --- a/src/Form/Toolbar/ExportToolbarForm.php +++ b/src/Form/Toolbar/ExportToolbarForm.php @@ -31,6 +31,7 @@ class ExportToolbarForm extends AbstractToolbarForm $this->addTimesheetStateChoice($builder); if ($options['include_user']) { $this->addUsersChoice($builder); + $this->addTeamsChoice($builder); } $this->addDateRange($builder, ['timezone' => $options['timezone']]); $this->addCustomerMultiChoice($builder, ['start_date_param' => null, 'end_date_param' => null, 'ignore_date' => true], true); diff --git a/src/Form/Toolbar/InvoiceToolbarForm.php b/src/Form/Toolbar/InvoiceToolbarForm.php index 3446a396..ef9f7ba6 100644 --- a/src/Form/Toolbar/InvoiceToolbarForm.php +++ b/src/Form/Toolbar/InvoiceToolbarForm.php @@ -26,6 +26,7 @@ class InvoiceToolbarForm extends InvoiceToolbarSimpleForm $this->addSearchTermInputField($builder); if ($options['include_user']) { $this->addUsersChoice($builder); + $this->addTeamsChoice($builder); } $this->addActivityMultiChoice($builder, $options, true); $this->addTagInputField($builder); diff --git a/src/Form/Toolbar/TimesheetToolbarForm.php b/src/Form/Toolbar/TimesheetToolbarForm.php index 91804a54..f6065c85 100644 --- a/src/Form/Toolbar/TimesheetToolbarForm.php +++ b/src/Form/Toolbar/TimesheetToolbarForm.php @@ -36,6 +36,7 @@ class TimesheetToolbarForm extends AbstractToolbarForm $this->addTagInputField($builder); if ($options['include_user']) { $this->addUsersChoice($builder); + $this->addTeamsChoice($builder); } $this->addTimesheetStateChoice($builder); $this->addBillableChoice($builder); diff --git a/src/Reporting/AbstractUserList.php b/src/Reporting/AbstractUserList.php index 57f47453..12e65c66 100644 --- a/src/Reporting/AbstractUserList.php +++ b/src/Reporting/AbstractUserList.php @@ -9,11 +9,17 @@ namespace App\Reporting; +use App\Entity\Team; + abstract class AbstractUserList { private $date; private $decimal = false; private $sumType = 'duration'; + /** + * @var Team|null + */ + private $team = null; public function getDate(): ?\DateTime { @@ -48,4 +54,14 @@ abstract class AbstractUserList $this->sumType = $sumType; } + + public function getTeam(): ?Team + { + return $this->team; + } + + public function setTeam(?Team $team = null): void + { + $this->team = $team; + } } diff --git a/src/Reporting/MonthlyUserListForm.php b/src/Reporting/MonthlyUserListForm.php index 722903b0..c35d0047 100644 --- a/src/Reporting/MonthlyUserListForm.php +++ b/src/Reporting/MonthlyUserListForm.php @@ -11,6 +11,7 @@ namespace App\Reporting; use App\Form\Type\MonthPickerType; use App\Form\Type\ReportSumType; +use App\Form\Type\TeamType; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; @@ -37,6 +38,11 @@ class MonthlyUserListForm extends AbstractType 'view_timezone' => $options['timezone'], 'start_date' => $options['start_date'], ]); + $builder->add('team', TeamType::class, [ + 'multiple' => false, + 'required' => false, + 'width' => false, + ]); $builder->add('sumType', ReportSumType::class); } diff --git a/src/Reporting/WeeklyUserListForm.php b/src/Reporting/WeeklyUserListForm.php index f5b57e28..577060ff 100644 --- a/src/Reporting/WeeklyUserListForm.php +++ b/src/Reporting/WeeklyUserListForm.php @@ -10,6 +10,7 @@ namespace App\Reporting; use App\Form\Type\ReportSumType; +use App\Form\Type\TeamType; use App\Form\Type\WeekPickerType; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; @@ -37,6 +38,11 @@ class WeeklyUserListForm extends AbstractType 'view_timezone' => $options['timezone'], 'start_date' => $options['start_date'], ]); + $builder->add('team', TeamType::class, [ + 'multiple' => false, + 'required' => false, + 'width' => false, + ]); $builder->add('sumType', ReportSumType::class); } diff --git a/src/Reporting/YearlyUserListForm.php b/src/Reporting/YearlyUserListForm.php index 35d7de0d..adb8e9b0 100644 --- a/src/Reporting/YearlyUserListForm.php +++ b/src/Reporting/YearlyUserListForm.php @@ -10,6 +10,7 @@ namespace App\Reporting; use App\Form\Type\ReportSumType; +use App\Form\Type\TeamType; use App\Form\Type\YearPickerType; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; @@ -38,6 +39,11 @@ class YearlyUserListForm extends AbstractType 'start_date' => $options['start_date'], 'show_range' => true, ]); + $builder->add('team', TeamType::class, [ + 'multiple' => false, + 'required' => false, + 'width' => false, + ]); $builder->add('sumType', ReportSumType::class); } diff --git a/src/User/TeamService.php b/src/User/TeamService.php new file mode 100644 index 00000000..77a9c216 --- /dev/null +++ b/src/User/TeamService.php @@ -0,0 +1,43 @@ + + */ + private $cache = []; + private $repository; + + public function __construct(TeamRepository $repository) + { + $this->repository = $repository; + } + + public function countTeams(): int + { + if (!\array_key_exists('count', $this->cache)) { + $this->cache['count'] = $this->repository->count([]); + } + + return $this->cache['count']; + } + + public function hasTeams(): bool + { + return $this->countTeams() > 0; + } +} diff --git a/src/User/UserService.php b/src/User/UserService.php index 0237eb35..ffd92e26 100644 --- a/src/User/UserService.php +++ b/src/User/UserService.php @@ -29,6 +29,11 @@ use Symfony\Component\Validator\Validator\ValidatorInterface; */ class UserService { + /** + * @var array + */ + private $cache = []; + private $repository; private $dispatcher; private $validator; @@ -44,6 +49,17 @@ class UserService $this->encoderFactory = $encoderFactory; } + public function countUser(?bool $enabled = null): int + { + $key = 'count' . ($enabled === null ? '_all' : ($enabled ? '_visible' : '_invisible')); + + if (!\array_key_exists($key, $this->cache)) { + $this->cache[$key] = $this->repository->countUser($enabled); + } + + return $this->cache[$key]; + } + public function createNewUser(): User { $user = new User(); diff --git a/templates/export/index.html.twig b/templates/export/index.html.twig index ce85e93b..68b0176e 100644 --- a/templates/export/index.html.twig +++ b/templates/export/index.html.twig @@ -47,6 +47,9 @@ {% if form.users is defined %} {{ form_row(form.users) }} {% endif %} + {% if form.teams is defined %} + {{ form_row(form.teams) }} + {% endif %} {{ form_row(form.billable) }} {{ form_row(form.exported) }} {{ form_row(form.state) }} diff --git a/templates/invoice/index.html.twig b/templates/invoice/index.html.twig index 09f88603..4cca3cbe 100644 --- a/templates/invoice/index.html.twig +++ b/templates/invoice/index.html.twig @@ -49,6 +49,9 @@ {% if form.users is defined %} {{ form_row(form.users, {'row_attr': {'class': 'invoice_search_form_row_users'}}) }} {% endif %} + {% if form.teams is defined %} + {{ form_row(form.teams, {'row_attr': {'class': 'invoice_search_form_row_teams'}}) }} + {% endif %} {% if form.exported is defined %} {{ form_row(form.exported, {'row_attr': {'class': 'invoice_search_form_row_exported'}}) }} {% endif %} diff --git a/templates/reporting/report_user_list.html.twig b/templates/reporting/report_user_list.html.twig index 9d71e443..657ef971 100644 --- a/templates/reporting/report_user_list.html.twig +++ b/templates/reporting/report_user_list.html.twig @@ -14,6 +14,9 @@ {% endblock %} {% block box_title %} {{ form_widget(form.date) }} + {% if form.team is defined %} + {{ form_widget(form.team) }} + {% endif %} {% if form.sumType.vars.choices|length > 1 %}