feat: allow overlapping assignments via flag set on individual teamers

This commit is contained in:
Björn Fromme
2025-12-15 15:06:32 +01:00
parent 4e92eebb39
commit a95291d4ec
6 changed files with 68 additions and 5 deletions
+31
View File
@@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
final class Version20251215135758 extends AbstractMigration
{
public function getDescription(): string
{
return 'Add allow_overlapping_applications column to teamer table';
}
public function up(Schema $schema): void
{
$this->addSql('ALTER TABLE teamer ADD allow_overlapping_applications TINYINT(1) NOT NULL DEFAULT 0');
}
public function postUp(Schema $schema): void
{
$this->connection->executeStatement('UPDATE teamer SET allow_overlapping_applications = 0');
}
public function down(Schema $schema): void
{
$this->addSql('ALTER TABLE teamer DROP allow_overlapping_applications');
}
}
@@ -7,6 +7,7 @@ use App\Repository\TrainingRepository;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
@@ -64,6 +65,10 @@ class SkillsController extends AbstractController
'Bestandsteamer' => Teamer::STATUS_EXISTING, 'Bestandsteamer' => Teamer::STATUS_EXISTING,
], ],
]) ])
->add('allowOverlappingApplications', CheckboxType::class, [
'label' => 'Überlappende Bewerbungen erlauben',
'required' => false,
])
->getForm(); ->getForm();
} }
} }
+15
View File
@@ -137,6 +137,9 @@ class Teamer implements TimestampableEntityInterface
#[ORM\Column] #[ORM\Column]
private bool $viewed = false; private bool $viewed = false;
#[ORM\Column]
private bool $allowOverlappingApplications = false;
public function __construct() public function __construct()
{ {
$this->uuid = Uuid::v4(); $this->uuid = Uuid::v4();
@@ -797,4 +800,16 @@ class Teamer implements TimestampableEntityInterface
return $this; return $this;
} }
public function isAllowOverlappingApplications(): bool
{
return $this->allowOverlappingApplications;
}
public function setAllowOverlappingApplications(bool $allowOverlappingApplications): static
{
$this->allowOverlappingApplications = $allowOverlappingApplications;
return $this;
}
} }
@@ -27,8 +27,13 @@ class InvalidateApplicationsListener
} }
$disposition = $document->getDisposition(); $disposition = $document->getDisposition();
$assignment = $disposition->getAssignment();
$teamer = $disposition->getTeamer(); $teamer = $disposition->getTeamer();
if (true === $teamer->isAllowOverlappingApplications()) {
return;
}
$assignment = $disposition->getAssignment();
$period = $assignment->getEffectivePeriod(); $period = $assignment->getEffectivePeriod();
// Find other applications by this teamer with overlapping date ranges // Find other applications by this teamer with overlapping date ranges
@@ -19,6 +19,10 @@ class ApplicationValidator extends ConstraintValidator
$teamer = $application->getTeamer(); $teamer = $application->getTeamer();
if (true === $teamer->isAllowOverlappingApplications()) {
return;
}
$assignment = $application->getAssignment(); $assignment = $application->getAssignment();
$destination = $assignment->getDestination(); $destination = $assignment->getDestination();
+7 -4
View File
@@ -17,12 +17,15 @@
</h2> </h2>
<div class="pb-4"> <div class="pb-4">
{{ form_start(form) }} {{ form_start(form) }}
<div class="flex items-center space-x-2"> <div class="pb-4">
{{ form_widget(form.status) }} {{ form_widget(form.status) }}
<button type="submit" class="btn btn--small">
Speichern
</button>
</div> </div>
<div class="pb-4">
{{ form_row(form.allowOverlappingApplications) }}
</div>
<button type="submit" class="btn btn--small">
Speichern
</button>
{{ form_rest(form) }} {{ form_rest(form) }}
{{ form_end(form) }} {{ form_end(form) }}
</div> </div>