Skip to content
489 changes: 489 additions & 0 deletions API/TimesheetApiController.php

Large diffs are not rendered by default.

156 changes: 152 additions & 4 deletions Controller/ApprovalController.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,13 @@

namespace KimaiPlugin\ApprovalBundle\Controller;

use App\Entity\User;
use App\Entity\Team;
use App\Form\Model\DateRange;
use App\Repository\UserRepository;
use App\Repository\TimesheetRepository;
use App\Repository\Query\BaseQuery;
use App\Repository\Query\TimesheetQuery;
use DateTime;
use KimaiPlugin\ApprovalBundle\Entity\Approval;
use KimaiPlugin\ApprovalBundle\Entity\ApprovalHistory;
Expand All @@ -18,9 +24,11 @@
use KimaiPlugin\ApprovalBundle\Repository\ApprovalRepository;
use KimaiPlugin\ApprovalBundle\Repository\ApprovalStatusRepository;
use KimaiPlugin\ApprovalBundle\Repository\LockdownRepository;
use KimaiPlugin\ApprovalBundle\Toolbox\BreakTimeCheckToolGER;
use KimaiPlugin\ApprovalBundle\Toolbox\EmailTool;
use KimaiPlugin\ApprovalBundle\Toolbox\SettingsTool;
use KimaiPlugin\ApprovalBundle\Enumeration\ConfigEnum;
use KimaiPlugin\ApprovalBundle\Service\AutoApprovalService;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Attribute\Route;
Expand All @@ -37,7 +45,10 @@ public function __construct(
private UserRepository $userRepository,
private EmailTool $emailTool,
private SettingsTool $settingsTool,
private LockdownRepository $lockdownRepository
private LockdownRepository $lockdownRepository,
private TimesheetRepository $timesheetRepository,
private BreakTimeCheckToolGER $breakTimeCheckToolGER,
private AutoApprovalService $autoApprovalService
) {
}

Expand All @@ -47,7 +58,7 @@ public function addToApprove(Request $request): RedirectResponse
$userId = $request->query->get('user');
$date = $request->query->get('date');
$approval = $this->createAddToApproveForm($userId, $date);
if ($this->settingsTool->getBooleanConfiguration(ConfigEnum::APPROVAL_MAIL_SUBMITTED_NY, true)){
if ($this->settingsTool->getBooleanConfiguration(ConfigEnum::APPROVAL_MAIL_SUBMITTED_NY, true)) {
$this->emailTool->sendApproveWeekEmail($approval, $this->approvalRepository);
}
$this->lockdownRepository->updateLockWeek($approval, $this->approvalRepository);
Expand All @@ -58,6 +69,89 @@ public function addToApprove(Request $request): RedirectResponse
]));
}

#[Route(path: '/auto_approve', name: 'auto_approve', methods: ['GET'])]
public function autoApproveAction(Request $request): RedirectResponse
{
$users = $this->getUsersForAutoApproval();
$query = $request->getSession()->get('query');

if (!empty($query->getUsers())) {
$users = $query->getUsers();
}

$submittedApprovals = $this->approvalRepository->getUserApprovalsFiltered($users, $query);

$result = $this->autoApprovalService->processApprovals($submittedApprovals);

// Process approved approvals
foreach ($result['processedApprovals'] as $approval) {
$this->finalizeApproval($approval, $request->query->get('date'));
}

return $this->buildAutoApprovalRedirect($query, $result['successful'], $result['failed'], $request);
}

private function getUsersForAutoApproval(): array
{
$includeSelf = $this->settingsTool->getConfiguration(ConfigEnum::APPROVAL_TEAMLEAD_SELF_APPROVE_NY) == '1';
return $this->getUsers($includeSelf);
}

private function finalizeApproval(Approval $approval, ?string $date): void
{
$approval = $this->createNewApproveHistory($approval->getId(), ApprovalStatus::APPROVED);

if ($this->settingsTool->getBooleanConfiguration(ConfigEnum::APPROVAL_MAIL_ACTION_NY, true)) {
$this->emailTool->sendStatusChangedEmail(
$approval,
$this->getUser()->getDisplayName(),
$this->approvalRepository->getUrl(
(string) $approval->getUser()->getId(),
$approval->getStartDate()->format('Y-m-d')
)
);
}

$this->lockdownRepository->updateLockWeek($approval, $this->approvalRepository);
$this->emailIfClosedMonth($date);
}

private function buildAutoApprovalRedirect($query, int $successCount, int $failCount, Request $request): RedirectResponse
{
if (!$query) {
return new RedirectResponse($this->urlGenerator->generate('approval_bundle_to_approve'));
}

$params = [
'page' => $query->getPage(),
'orderBy' => $query->getOrderBy(),
'order' => $query->getOrder(),
'auto_approve_success' => $successCount,
'auto_approve_fail' => $failCount,
];

if ($query->getSearchTerm() && !empty($query->getSearchTerm()->getSearchTerm())) {
$params['searchTerm'] = $query->getSearchTerm()->getSearchTerm();
$params['performSearch'] = 'performSearch';
}

if ($query->getBegin() && $query->getEnd()) {
$params['daterange'] = $query->getBegin()->format('d.m.Y') . ' - ' . $query->getEnd()->format('d.m.Y');
}

if (!empty($query->getUsers())) {
$params['users'] = array_map(fn($user) => $user->getId(), $query->getUsers());
}

if (!empty($query->getStatus())) {
$params['status'] = $query->getStatus();
}

$params['_token'] = $request->getSession()->get('_csrf/toolbar');

return new RedirectResponse($this->urlGenerator->generate('approval_bundle_to_approve', $params));
}

#[Route(path: '/approve/{approveId}', defaults: ['approveId' => 0], name: 'approve', methods: ['GET'])]
public function approveAction(Request $request, string $approveId): RedirectResponse
{
Expand All @@ -71,7 +165,7 @@ public function approveAction(Request $request, string $approveId): RedirectResp
);
if ($approval) {
$approval = $this->createNewApproveHistory($approveId, ApprovalStatus::APPROVED);
if ($this->settingsTool->getBooleanConfiguration(ConfigEnum::APPROVAL_MAIL_ACTION_NY, true)){
if ($this->settingsTool->getBooleanConfiguration(ConfigEnum::APPROVAL_MAIL_ACTION_NY, true)) {
$this->emailTool->sendStatusChangedEmail(
$approval,
$this->getUser()->getDisplayName(),
Expand Down Expand Up @@ -129,7 +223,7 @@ public function deniedAction(Request $request, string $approveId): RedirectRespo
);
if ($approval) {
$approval = $this->createNewApproveHistory($approveId, ApprovalStatus::DENIED, $request->query->get('input'));
if ($this->settingsTool->getBooleanConfiguration(ConfigEnum::APPROVAL_MAIL_ACTION_NY, true)){
if ($this->settingsTool->getBooleanConfiguration(ConfigEnum::APPROVAL_MAIL_ACTION_NY, true)) {
$this->emailTool->sendStatusChangedEmail(
$approval,
$this->getUser()->getDisplayName(),
Expand Down Expand Up @@ -211,4 +305,58 @@ private function emailIfClosedMonth($date): void
}
}
}

private function getUsers(bool $includeOwnForTeam = true): array
{
if ($this->canManageAllPerson()) {
$users = $this->userRepository->findAll();
} elseif ($this->canManageTeam()) {
$users = [];
$user = $this->getUser();
/** @var Team $team */
foreach ($user->getTeams() as $team) {
if (\in_array($user, $team->getTeamleads())) {
array_push($users, ...$team->getUsers());
} else {
$users[] = $user;
}
}

if (empty($users)) {
$users = [$user];
}

$users = array_unique($users);

if (!$includeOwnForTeam) {
// remove the active user from the list
$index = array_search($this->getUser(), $users);
if ($index !== false) {
unset($users[$index]);
}
}
} else {
$users = [$this->getUser()];
}

$users = array_reduce($users, function ($current, $user) {
$includeSuperAdmin = $this->settingsTool->getConfiguration(ConfigEnum::APPROVAL_INCLUDE_ADMIN_NY) == '1';
if ($user->isEnabled() && (!$user->isSuperAdmin() || $includeSuperAdmin)) {
$current[] = $user;
}

return $current;
}, []);

if (!empty($users)) {
usort(
$users,
function (User $userA, User $userB) {
return strcmp(strtoupper($userA->getUsername()), strtoupper($userB->getUsername()));
}
);
}

return $users;
}
}
3 changes: 2 additions & 1 deletion Controller/BaseApprovalController.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ protected function getDefaultTemplateParams(SettingsTool $settingsTool): array
'showToApproveTab' => $this->canManageAllPerson() || $this->canManageTeam(),
'showSettings' => $this->isGranted('ROLE_SUPER_ADMIN'),
'showSettingsWorkdays' => $this->isGranted('ROLE_SUPER_ADMIN') && $settingsTool->isOvertimeCheckActive(),
'showOvertime' => $settingsTool->isOvertimeCheckActive()
'showOvertime' => $settingsTool->isOvertimeCheckActive(),
'showWorkingTimeActCheckGER' => $this->isGranted('ROLE_SUPER_ADMIN') && $settingsTool->isBreakTimeCheckActive(),
];
}
}
Loading