feat: allow overlapping assignments via flag set on individual teamers
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user