* added support for hourly rate column in detail table * allow to register icon in extension * allow to show QR code secret * new translations * bump theme and packages * fix validation for invoice-document-filenames with uppercase character * max upload size 1MB * fix last month in daterange-picker in certain situations, more years in quick-select * remove unused package-versions-deprecated * link preferences from contract warning message * added page_setup page layout * prevent DROP TABLE in addSQL() and replace drop table with schema call * added azuyalabs/yasumi
96 lines
3.3 KiB
PHP
96 lines
3.3 KiB
PHP
<?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;
|
|
|
|
use App\Entity\User;
|
|
use App\Event\WorkContractDetailControllerEvent;
|
|
use App\Form\ContractByUserForm;
|
|
use App\Reporting\YearByUser\YearByUser;
|
|
use App\Utils\PageSetup;
|
|
use App\WorkingTime\Model\BoxConfiguration;
|
|
use App\WorkingTime\WorkingTimeService;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
use Symfony\Component\Routing\Annotation\Route;
|
|
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
|
|
|
|
/**
|
|
* Users can control their working time statistics
|
|
*/
|
|
final class ContractController extends AbstractController
|
|
{
|
|
#[Route(path: '/contract', name: 'user_contract', methods: ['GET', 'POST'])]
|
|
public function __invoke(Request $request, WorkingTimeService $workingTimeService, EventDispatcherInterface $eventDispatcher): Response
|
|
{
|
|
$currentUser = $this->getUser();
|
|
$dateTimeFactory = $this->getDateTimeFactory($currentUser);
|
|
$canChangeUser = $this->isGranted('contract_other_profile');
|
|
$defaultDate = $dateTimeFactory->createStartOfYear();
|
|
|
|
$values = new YearByUser();
|
|
$values->setUser($currentUser);
|
|
$values->setDate($defaultDate);
|
|
|
|
$form = $this->createFormForGetRequest(ContractByUserForm::class, $values, [
|
|
'include_user' => $canChangeUser,
|
|
'timezone' => $dateTimeFactory->getTimezone()->getName(),
|
|
'start_date' => $values->getDate(),
|
|
]);
|
|
|
|
$form->submit($request->query->all(), false);
|
|
|
|
if ($values->getUser() === null) {
|
|
$values->setUser($currentUser);
|
|
}
|
|
|
|
/** @var User $profile */
|
|
$profile = $values->getUser();
|
|
if ($this->getUser() !== $profile && !$canChangeUser) {
|
|
throw $this->createAccessDeniedException('Cannot access user contract settings');
|
|
}
|
|
|
|
if ($values->getDate() === null) {
|
|
$values->setDate(clone $defaultDate);
|
|
}
|
|
|
|
/** @var \DateTime $yearDate */
|
|
$yearDate = $values->getDate();
|
|
$year = $workingTimeService->getYear($profile, $yearDate);
|
|
|
|
$page = new PageSetup('work_times');
|
|
$page->setHelp('contract.html');
|
|
$page->setActionName('contract');
|
|
$page->setPaginationForm($form);
|
|
|
|
// additional boxes by plugins
|
|
$controllerEvent = new WorkContractDetailControllerEvent($year);
|
|
$eventDispatcher->dispatch($controllerEvent);
|
|
|
|
$now = $dateTimeFactory->createDateTime();
|
|
$summary = $workingTimeService->getYearSummary($year, $now);
|
|
|
|
$boxConfiguration = new BoxConfiguration();
|
|
$boxConfiguration->setDecimal(false);
|
|
$boxConfiguration->setCollapsed($profile->hasWorkHourConfiguration() && $summary->count() > 0);
|
|
|
|
return $this->render('contract/status.html.twig', [
|
|
'box_configuration' => $boxConfiguration,
|
|
'page_setup' => $page,
|
|
'decimal' => $boxConfiguration->isDecimal(),
|
|
'summaries' => $summary,
|
|
'now' => $now,
|
|
'boxes' => $controllerEvent->getController(),
|
|
'year' => $year,
|
|
'user' => $profile,
|
|
'form' => $form->createView(),
|
|
]);
|
|
}
|
|
}
|