Edit file File name : ReportUsersYearController.php Content :<?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\Controller\Reporting; use App\Configuration\SystemConfiguration; use App\Controller\AbstractController; use App\Export\Spreadsheet\Writer\BinaryFileResponseWriter; use App\Export\Spreadsheet\Writer\XlsxWriter; use App\Model\MonthlyStatistic; use App\Reporting\YearlyUserList; use App\Reporting\YearlyUserListForm; use App\Repository\Query\UserQuery; use App\Repository\UserRepository; use App\Timesheet\TimesheetStatisticService; use Exception; use PhpOffice\PhpSpreadsheet\Reader\Html; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; /** * @Route(path="/reporting/users") * @Security("is_granted('view_reporting') and is_granted('view_other_reporting') and is_granted('view_other_timesheet')") */ final class ReportUsersYearController extends AbstractController { /** * @Route(path="/year", name="report_yearly_users", methods={"GET","POST"}) * * @param Request $request * @return Response * @throws Exception */ public function report(Request $request, SystemConfiguration $systemConfiguration, TimesheetStatisticService $statisticService, UserRepository $userRepository): Response { return $this->render( 'reporting/report_user_list_monthly.html.twig', $this->getData($request, $systemConfiguration, $statisticService, $userRepository) ); } /** * @Route(path="/year_export", name="report_yearly_users_export", methods={"GET","POST"}) * * @param Request $request * @return Response * @throws Exception */ public function export(Request $request, SystemConfiguration $systemConfiguration, TimesheetStatisticService $statisticService, UserRepository $userRepository): Response { $data = $this->getData($request, $systemConfiguration, $statisticService, $userRepository); $content = $this->container->get('twig')->render('reporting/report_user_list_monthly_export.html.twig', $data); $reader = new Html(); $spreadsheet = $reader->loadFromString($content); $writer = new BinaryFileResponseWriter(new XlsxWriter(), 'kimai-export-users-yearly'); return $writer->getFileResponse($spreadsheet); } private function getData(Request $request, SystemConfiguration $systemConfiguration, TimesheetStatisticService $statisticService, UserRepository $userRepository): array { $currentUser = $this->getUser(); $dateTimeFactory = $this->getDateTimeFactory(); $query = new UserQuery(); $query->setCurrentUser($currentUser); $allUsers = $userRepository->getUsersForQuery($query); $defaultDate = $dateTimeFactory->createStartOfYear(); if (null !== ($financialYear = $systemConfiguration->getFinancialYearStart())) { $defaultDate = $this->getDateTimeFactory()->createStartOfFinancialYear($financialYear); } $values = new YearlyUserList(); $values->setDate(clone $defaultDate); $form = $this->createForm(YearlyUserListForm::class, $values, [ 'timezone' => $dateTimeFactory->getTimezone()->getName(), 'start_date' => $values->getDate(), ]); $form->submit($request->query->all(), false); if ($form->isSubmitted() && !$form->isValid()) { $values->setDate(clone $defaultDate); } if ($values->getDate() === null) { $values->setDate(clone $defaultDate); } $start = $values->getDate(); // there is a potential edge case bug for financial years: // the last month will be skipped, if the financial year started on a different day than the first $end = $dateTimeFactory->createEndOfFinancialYear($start); $monthStats = []; $hasData = true; if (!empty($allUsers)) { $monthStats = $statisticService->getMonthlyStats($start, $end, $allUsers); } if (empty($monthStats)) { $monthStats = [new MonthlyStatistic($start, $end, $currentUser)]; $hasData = false; } return [ 'query' => $values, 'period_attribute' => 'months', 'dataType' => $values->getSumType(), 'report_title' => 'report_yearly_users', 'box_id' => 'yearly-user-list-reporting-box', 'export_route' => 'report_yearly_users_export', 'decimal' => $values->isDecimal(), 'form' => $form->createView(), 'stats' => $monthStats, 'hasData' => $hasData, ]; } } Save