laneMode = $mode; } public function setElapsedWashTimeSecondsForTest(int $seconds): void { $this->elapsedWashTimeSeconds = $seconds; } public function setIncludedMinutesForTest(int $minutes): void { $this->includedMinutes = $minutes; } public function getLaneStatus(): selfserve_lane_status { return $this->laneStatus; } public function getLaneMode(): selfserve_lane_mode { return $this->laneMode; } public function getCustomerNumber(): int { return $this->customerNumber; } public function getLicensePlate(): string { return $this->licensePlate; } public function getMinuteBillingProductId(): ?int { return $this->minuteBillingProductId; } public function getElapsedWashTime(): ?int { return $this->elapsedWashTimeSeconds; } public function getMachineWashMinutesIncluded(): int { return $this->includedMinutes; } protected function createInvoiceOrderContext(): orders_o { $order = new SelfserveLaneInvoiceModeOrderStub(); $order->id = 424242; $this->last_invoice_order_id = (int)$order->id; return $order; } protected function addMinuteBillingLine(int $order_id, int $product_id, int $quantity): void { $this->lastAddedOrderId = $order_id; $this->lastAddedProductId = $product_id; $this->lastAddedQuantity = $quantity; } } it('bills manual self-serve stop using full elapsed minutes without included-minute reduction', function (): void { $harness = new SelfserveLaneInvoiceModeBillingHarness(); $harness->setLaneModeForTest(selfserve_lane_mode::MANUAL); $harness->setElapsedWashTimeSecondsForTest(59); $harness->setIncludedMinutesForTest(5); $result = $harness->invoice(); expect($result)->toBeTrue(); expect($harness->lastAddedOrderId)->toBe(424242); expect($harness->lastAddedProductId)->toBe(999); expect($harness->lastAddedQuantity)->toBe(1); expect($harness->getLastInvoiceOrderId())->toBe(424242); }); it('keeps included-minute reduction for automatic mode', function (): void { $harness = new SelfserveLaneInvoiceModeBillingHarness(); $harness->setLaneModeForTest(selfserve_lane_mode::AUTOMATIC); $harness->setElapsedWashTimeSecondsForTest(59); $harness->setIncludedMinutesForTest(5); $result = $harness->invoice(); expect($result)->toBeTrue(); expect($harness->lastAddedOrderId)->toBeNull(); expect($harness->lastAddedProductId)->toBeNull(); expect($harness->lastAddedQuantity)->toBeNull(); expect($harness->getLastInvoiceOrderId())->toBeNull(); });