WIP: Implement application process

This commit is contained in:
Björn Fromme
2023-10-10 17:50:50 +02:00
parent 6910ab6134
commit 7084e1528e
11 changed files with 225 additions and 6 deletions
@@ -0,0 +1,49 @@
<?php
namespace App\Controller\Teamer\Application;
use App\Entity\User;
use App\Repository\ApplicationRepository;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Attribute\IsGranted;
class IndexController extends AbstractController
{
public function __construct(
private readonly ApplicationRepository $applicationRepository,
private readonly PaginatorInterface $paginator
) {
}
#[Route('/teamer/application/pending', name: 'app_teamer_application_index')]
#[IsGranted('ROLE_TEAMER')]
public function index(Request $request): Response
{
/** @var User $user */
$user = $this->getUser();
$teamer = $user->getTeamer();
$query = $this
->applicationRepository
->getPendingForTeamerQuery($teamer)
;
$pagination = $this->paginator->paginate(
$query,
$request->query->getInt('page', 1),
10,
[
'defaultSortFieldName' => 'assignment.dateFrom',
'defaultSortDirection' => 'asc',
]
);
return $this->render('teamer/application/index.html.twig', [
'pagination' => $pagination,
]);
}
}
@@ -2,20 +2,25 @@
namespace App\Controller\Teamer\Disposition;
use App\Controller\Traits\ReturnUrlTrait;
use App\Entity\Disposition;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Attribute\IsGranted;
class DetailController extends AbstractController
{
use ReturnUrlTrait;
#[Route('/teamer/disposition/detail/{uuid}', name: 'app_teamer_disposition_detail')]
#[IsGranted('VIEW', subject: 'disposition')]
public function index(Disposition $disposition): Response
public function index(Disposition $disposition, Request $request): Response
{
return $this->render('teamer/disposition/detail.html.twig', [
'disposition' => $disposition,
'returnUrl' => $this->getReturnUrl($request, 'app_teamer_index'),
]);
}
}
@@ -0,0 +1,18 @@
<?php
namespace App\Controller\Teamer\Document;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Attribute\IsGranted;
class IndexController extends AbstractController
{
#[Route('/teamer/document', name: 'app_teamer_document_index')]
#[IsGranted('ROLE_TEAMER')]
public function index(): Response
{
return $this->render('');
}
}
@@ -0,0 +1,18 @@
<?php
namespace App\Controller\Teamer\Feedback;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Attribute\IsGranted;
class IndexController extends AbstractController
{
#[Route('/teamer/feedback', name: 'app_teamer_feedback_index')]
#[IsGranted('ROLE_TEAMER')]
public function index(): Response
{
return $this->render('');
}
}
+4
View File
@@ -17,10 +17,14 @@ class Upload implements BlameableEntityInterface, TimestampableEntityInterface
public const TYPE_PHOTO = 'photo';
public const TYPE_CERTIFICATE = 'certificate';
public const TYPE_CONTRACT = 'contract';
public const TYPE_INVOICE = 'invoice';
public const STATUS_NEW = 'new';
public const STATUS_IN_PROCESS = 'in_process';
public const STATUS_CHECKED = 'checked';
public const STATUS_PAYED = 'payed';
public const STATUS_ERROR = 'error';
#[ORM\Id]
#[ORM\GeneratedValue]
+4 -4
View File
@@ -45,13 +45,13 @@ class TeamerMenuBuilder extends AbstractMenuBuilder
'route' => false,
'title' => 'Meine Einsätze',
'icon' => 'bus',
'children' => [
'children' => [#
[
'route' => 'app_teamer_bookmark_index',
'title' => 'Merkliste',
],
[
'route' => 'app_teamer_bookmark_index',
'route' => 'app_teamer_application_index',
'title' => 'Offene Bewerbungen',
],
[
@@ -63,11 +63,11 @@ class TeamerMenuBuilder extends AbstractMenuBuilder
'title' => 'Letzte Einsätze',
],
[
'route' => 'app_teamer_bookmark_index',
'route' => 'app_teamer_document_index',
'title' => 'Meine Dokumente',
],
[
'route' => 'app_teamer_bookmark_index',
'route' => 'app_teamer_feedback_index',
'title' => 'Mein Feedback',
],
],
+16
View File
@@ -3,6 +3,7 @@
namespace App\Repository;
use App\Entity\Application;
use App\Entity\Teamer;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\Query;
use Doctrine\Persistence\ManagerRegistry;
@@ -35,4 +36,19 @@ class ApplicationRepository extends ServiceEntityRepository
->getQuery()
;
}
public function getPendingForTeamerQuery(Teamer $teamer): Query
{
$qb = $this->createQueryBuilder('application');
return $qb
->select('application', 'assignment', 'destination', 'job_profile')
->innerJoin('application.assignment', 'assignment')
->innerJoin('assignment.destination', 'destination')
->innerJoin('assignment.jobProfile', 'job_profile')
->where($qb->expr()->eq('application.teamer', ':teamer'))
->setParameter('teamer', $teamer)
->getQuery()
;
}
}