diff --git a/migrations/Version20260321200000.php b/migrations/Version20260321200000.php new file mode 100644 index 0000000..afc1f7b --- /dev/null +++ b/migrations/Version20260321200000.php @@ -0,0 +1,32 @@ +addSql("ALTER TABLE billet_order ADD COLUMN IF NOT EXISTS state VARCHAR(20) DEFAULT 'valid' NOT NULL"); + $this->addSql('ALTER TABLE billet_order ADD COLUMN IF NOT EXISTS first_scanned_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL'); + $this->addSql('ALTER TABLE billet_order DROP COLUMN IF EXISTS is_scanned'); + $this->addSql('ALTER TABLE billet_order DROP COLUMN IF EXISTS scanned_at'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE billet_order ADD COLUMN IF NOT EXISTS is_scanned BOOLEAN DEFAULT false NOT NULL'); + $this->addSql('ALTER TABLE billet_order ADD COLUMN IF NOT EXISTS scanned_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL'); + $this->addSql('ALTER TABLE billet_order DROP COLUMN IF EXISTS state'); + $this->addSql('ALTER TABLE billet_order DROP COLUMN IF EXISTS first_scanned_at'); + } +} diff --git a/src/Entity/BilletOrder.php b/src/Entity/BilletOrder.php index 3838469..7988d24 100644 --- a/src/Entity/BilletOrder.php +++ b/src/Entity/BilletOrder.php @@ -30,11 +30,15 @@ class BilletOrder #[ORM\Column] private int $unitPriceHT = 0; - #[ORM\Column] - private bool $isScanned = false; + public const STATE_VALID = 'valid'; + public const STATE_INVALID = 'invalid'; + public const STATE_EXPIRED = 'expired'; + + #[ORM\Column(length: 20)] + private string $state = self::STATE_VALID; #[ORM\Column(nullable: true)] - private ?\DateTimeImmutable $scannedAt = null; + private ?\DateTimeImmutable $firstScannedAt = null; #[ORM\Column] private \DateTimeImmutable $createdAt; @@ -108,26 +112,31 @@ class BilletOrder return $this->unitPriceHT / 100; } - public function isScanned(): bool + public function getState(): string { - return $this->isScanned; + return $this->state; } - public function setIsScanned(bool $isScanned): static + public function setState(string $state): static { - $this->isScanned = $isScanned; + $this->state = $state; return $this; } - public function getScannedAt(): ?\DateTimeImmutable + public function isValid(): bool { - return $this->scannedAt; + return self::STATE_VALID === $this->state; } - public function setScannedAt(?\DateTimeImmutable $scannedAt): static + public function getFirstScannedAt(): ?\DateTimeImmutable { - $this->scannedAt = $scannedAt; + return $this->firstScannedAt; + } + + public function setFirstScannedAt(?\DateTimeImmutable $firstScannedAt): static + { + $this->firstScannedAt = $firstScannedAt; return $this; } diff --git a/templates/order/public.html.twig b/templates/order/public.html.twig index 8027cd6..47fe3b6 100644 --- a/templates/order/public.html.twig +++ b/templates/order/public.html.twig @@ -41,8 +41,12 @@

{{ ticket.reference }}

{{ ticket.unitPriceHTDecimal|number_format(2, ',', ' ') }} € - {% if ticket.scanned %} - Scanne + {% if ticket.state == 'valid' %} + Valide + {% elseif ticket.state == 'expired' %} + Expire + {% else %} + Invalide {% endif %} Telecharger PDF diff --git a/tests/Entity/BilletOrderTest.php b/tests/Entity/BilletOrderTest.php index 101af89..db57b79 100644 --- a/tests/Entity/BilletOrderTest.php +++ b/tests/Entity/BilletOrderTest.php @@ -19,8 +19,9 @@ class BilletOrderTest extends TestCase self::assertNull($ticket->getBilletName()); self::assertSame(0, $ticket->getUnitPriceHT()); self::assertSame(0.0, $ticket->getUnitPriceHTDecimal()); - self::assertFalse($ticket->isScanned()); - self::assertNull($ticket->getScannedAt()); + self::assertSame(BilletOrder::STATE_VALID, $ticket->getState()); + self::assertTrue($ticket->isValid()); + self::assertNull($ticket->getFirstScannedAt()); self::assertMatchesRegularExpression('/^ETICKET-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$/', $ticket->getReference()); self::assertInstanceOf(\DateTimeImmutable::class, $ticket->getCreatedAt()); } @@ -64,22 +65,30 @@ class BilletOrderTest extends TestCase self::assertSame($ticket, $result); } - public function testSetAndGetIsScanned(): void + public function testSetAndGetState(): void { $ticket = new BilletOrder(); - $result = $ticket->setIsScanned(true); + $result = $ticket->setState(BilletOrder::STATE_INVALID); - self::assertTrue($ticket->isScanned()); + self::assertSame(BilletOrder::STATE_INVALID, $ticket->getState()); + self::assertFalse($ticket->isValid()); self::assertSame($ticket, $result); + + $ticket->setState(BilletOrder::STATE_EXPIRED); + self::assertSame(BilletOrder::STATE_EXPIRED, $ticket->getState()); + self::assertFalse($ticket->isValid()); + + $ticket->setState(BilletOrder::STATE_VALID); + self::assertTrue($ticket->isValid()); } - public function testSetAndGetScannedAt(): void + public function testSetAndGetFirstScannedAt(): void { $ticket = new BilletOrder(); $date = new \DateTimeImmutable(); - $result = $ticket->setScannedAt($date); + $result = $ticket->setFirstScannedAt($date); - self::assertSame($date, $ticket->getScannedAt()); + self::assertSame($date, $ticket->getFirstScannedAt()); self::assertSame($ticket, $result); }