feat: generate draft assignments from a staffing matrix
This commit is contained in:
1 parent
3116d23199
commit
2fc9806c69
41 files changed
+2618
No files matched your search
@@ -0,0 +1,105 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Tests\Repository;
|
||||
|
||||
use App\Entity\Assignment;
|
||||
use App\Entity\Destination;
|
||||
use App\Repository\AssignmentRepository;
|
||||
use App\Repository\DestinationRepository;
|
||||
use Doctrine\DBAL\Connection;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
|
||||
|
||||
/**
|
||||
* Which dates the staffing matrix applies to, and which of them it must leave alone. Both are
|
||||
* "does it return the right rows" questions, so they run against real rows.
|
||||
*/
|
||||
class StaffingCandidateQueryTest extends KernelTestCase
|
||||
{
|
||||
private const LATEST_IMPORT = '2026-10-15 03:20:00';
|
||||
|
||||
private EntityManagerInterface $entityManager;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
self::bootKernel();
|
||||
|
||||
$this->entityManager = self::getContainer()->get(EntityManagerInterface::class);
|
||||
|
||||
$connection = self::getContainer()->get(Connection::class);
|
||||
$connection->executeStatement('DELETE FROM assignment_fee');
|
||||
$connection->executeStatement('DELETE FROM assignment');
|
||||
$connection->executeStatement('DELETE FROM destination');
|
||||
}
|
||||
|
||||
public function testOnlyLiveFutureDatesOfMatrixProductsFromTheLatestImport(): void
|
||||
{
|
||||
$match = $this->destination('DKIMP110127', 'DKIMP');
|
||||
$this->destination('DKIMP040127', 'DKIMP', dateFrom: '2026-10-15'); // starts today
|
||||
$this->destination('DKIMP180127', 'DKIMP', importedAt: '2026-10-14 03:20:00'); // cancelled upstream
|
||||
$this->destination('DKIMP250127', 'DKIMP')->setDeleted();
|
||||
$this->destination('DGSMP110127', 'DGSMP'); // not in the matrix
|
||||
$this->destination('XYZ110127', null); // one-off date
|
||||
$this->entityManager->flush();
|
||||
|
||||
$candidates = $this->destinationRepository()->getStaffingCandidates(['DKIMP'], new \DateTimeImmutable('2026-10-15'));
|
||||
|
||||
$this->assertSame([$match], $candidates);
|
||||
}
|
||||
|
||||
public function testAnEmptyMatrixMatchesNothing(): void
|
||||
{
|
||||
$this->destination('DKIMP110127', 'DKIMP');
|
||||
$this->entityManager->flush();
|
||||
|
||||
$this->assertSame([], $this->destinationRepository()->getStaffingCandidates([], new \DateTimeImmutable('2026-10-15')));
|
||||
}
|
||||
|
||||
public function testADeletedAssignmentStillCounts(): void
|
||||
{
|
||||
$untouched = $this->destination('DKIMP110127', 'DKIMP');
|
||||
$live = $this->destination('DKIMP180127', 'DKIMP');
|
||||
$deleted = $this->destination('DKIMP250127', 'DKIMP');
|
||||
|
||||
$this->entityManager->persist((new Assignment())->setDestination($live));
|
||||
$this->entityManager->persist((new Assignment())->setDestination($deleted)->setDeleted());
|
||||
$this->entityManager->flush();
|
||||
|
||||
/** @var AssignmentRepository $repository */
|
||||
$repository = self::getContainer()->get(AssignmentRepository::class);
|
||||
$ids = $repository->getDestinationIdsWithAnyAssignment([$untouched, $live, $deleted]);
|
||||
sort($ids);
|
||||
|
||||
$this->assertSame([$live->getId(), $deleted->getId()], $ids);
|
||||
}
|
||||
|
||||
private function destination(
|
||||
string $code,
|
||||
?string $productCode,
|
||||
string $dateFrom = '2027-01-11',
|
||||
string $importedAt = self::LATEST_IMPORT,
|
||||
): Destination {
|
||||
$destination = (new Destination())
|
||||
->setCode($code)
|
||||
->setProductCode($productCode)
|
||||
->setDateFrom(new \DateTimeImmutable($dateFrom))
|
||||
->setDateTo((new \DateTimeImmutable($dateFrom))->modify('+5 days'))
|
||||
->setProduct('Davos Klosters - Schwendi')
|
||||
->setHotel('Schwendi')
|
||||
->setHotelCode('DKI')
|
||||
->setHotelBusProId(1)
|
||||
->setImportedAt(new \DateTimeImmutable($importedAt))
|
||||
;
|
||||
|
||||
$this->entityManager->persist($destination);
|
||||
|
||||
return $destination;
|
||||
}
|
||||
|
||||
private function destinationRepository(): DestinationRepository
|
||||
{
|
||||
return self::getContainer()->get(DestinationRepository::class);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user