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 Psr\Log\LoggerInterface;
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\FormInterface;
use Symfony\Component\HttpFoundation\Request;
@@ -64,6 +65,10 @@ class SkillsController extends AbstractController
'Bestandsteamer' => Teamer::STATUS_EXISTING,
],
])
->add('allowOverlappingApplications', CheckboxType::class, [
'label' => 'Überlappende Bewerbungen erlauben',
'required' => false,
])
->getForm();
}
}
+15
View File
@@ -137,6 +137,9 @@ class Teamer implements TimestampableEntityInterface
#[ORM\Column]
private bool $viewed = false;
#[ORM\Column]
private bool $allowOverlappingApplications = false;
public function __construct()
{
$this->uuid = Uuid::v4();
@@ -797,4 +800,16 @@ class Teamer implements TimestampableEntityInterface
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();
$assignment = $disposition->getAssignment();
$teamer = $disposition->getTeamer();
if (true === $teamer->isAllowOverlappingApplications()) {
return;
}
$assignment = $disposition->getAssignment();
$period = $assignment->getEffectivePeriod();
// Find other applications by this teamer with overlapping date ranges
@@ -19,6 +19,10 @@ class ApplicationValidator extends ConstraintValidator
$teamer = $application->getTeamer();
if (true === $teamer->isAllowOverlappingApplications()) {
return;
}
$assignment = $application->getAssignment();
$destination = $assignment->getDestination();
+7 -4
View File
@@ -17,12 +17,15 @@
</h2>
<div class="pb-4">
{{ form_start(form) }}
<div class="flex items-center space-x-2">
<div class="pb-4">
{{ form_widget(form.status) }}
<button type="submit" class="btn btn--small">
Speichern
</button>
</div>
<div class="pb-4">
{{ form_row(form.allowOverlappingApplications) }}
</div>
<button type="submit" class="btn btn--small">
Speichern
</button>
{{ form_rest(form) }}
{{ form_end(form) }}
</div>