fix: read one-sided booking times as "ab" and "bis"
This commit is contained in:
1 parent
179769187b
commit
bbb0a8aaa2
4 files changed
+29
-4
No files matched your search
+18
-1
@@ -164,9 +164,26 @@ final readonly class TimeRange implements \Stringable
|
|||||||
return self::format($this->endMinute);
|
return self::format($this->endMinute);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* One-sided spans read as "bis 13:00" / "ab 13:00" rather than 00:00–13:00 / 13:00–24:00:
|
||||||
|
* a half day booked by giving only one end has no meaningful other end, and midnight is not
|
||||||
|
* what the user typed.
|
||||||
|
*/
|
||||||
public function __toString(): string
|
public function __toString(): string
|
||||||
{
|
{
|
||||||
return $this->isAllDay() ? 'ganztägig' : $this->start().'–'.$this->end();
|
if ($this->isAllDay()) {
|
||||||
|
return 'ganztägig';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self::DAY_START === $this->startMinute) {
|
||||||
|
return 'bis '.$this->end();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self::DAY_END === $this->endMinute) {
|
||||||
|
return 'ab '.$this->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->start().'–'.$this->end();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static function minutesOf(\DateTimeInterface $time): int
|
private static function minutesOf(\DateTimeInterface $time): int
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ class FloorPlanTest extends WebTestCase
|
|||||||
$this->book($desk, $this->user('[email protected]', 'Bea Kranz'), 540, 780);
|
$this->book($desk, $this->user('[email protected]', 'Bea Kranz'), 540, 780);
|
||||||
|
|
||||||
self::assertSame(
|
self::assertSame(
|
||||||
['Schreibtisch 01', 'Bea K. 09:00–13:00', 'frei 13:00–24:00'],
|
['Schreibtisch 01', 'Bea K. 09:00–13:00', 'frei ab 13:00'],
|
||||||
$this->linesOf($this->board()),
|
$this->linesOf($this->board()),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -112,7 +112,7 @@ class FloorPlanTest extends WebTestCase
|
|||||||
$lines = $this->linesOf($this->board());
|
$lines = $this->linesOf($this->board());
|
||||||
|
|
||||||
self::assertSame(
|
self::assertSame(
|
||||||
['Schreibtisch 01', 'Ann A. 00:00–06:00', 'Bea B. 06:00–12:00', '+2 weitere'],
|
['Schreibtisch 01', 'Ann A. bis 06:00', 'Bea B. 06:00–12:00', '+2 weitere'],
|
||||||
$lines,
|
$lines,
|
||||||
);
|
);
|
||||||
// Label plus MAX_LINES, never more.
|
// Label plus MAX_LINES, never more.
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ class SpotTest extends TestCase
|
|||||||
// Taken 09:00-13:00 leaves 00:00-09:00 (9h) and 13:00-24:00 (11h).
|
// Taken 09:00-13:00 leaves 00:00-09:00 (9h) and 13:00-24:00 (11h).
|
||||||
$spot = $this->spot([$this->booking($this->someoneElse(), 540, 780)]);
|
$spot = $this->spot([$this->booking($this->someoneElse(), 540, 780)]);
|
||||||
|
|
||||||
self::assertSame('13:00–24:00', (string) $spot->suggested());
|
self::assertSame('ab 13:00', (string) $spot->suggested());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testTheSuggestedWindowIsAlwaysBookable(): void
|
public function testTheSuggestedWindowIsAlwaysBookable(): void
|
||||||
|
|||||||
@@ -149,6 +149,14 @@ class TimeRangeTest extends TestCase
|
|||||||
self::assertSame('yes', $twig->render('t', ['range' => TimeRange::wholeDay()]));
|
self::assertSame('yes', $twig->render('t', ['range' => TimeRange::wholeDay()]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testAOneSidedRangeReadsAsAbOrBis(): void
|
||||||
|
{
|
||||||
|
self::assertSame('bis 13:00', (string) TimeRange::fromMinutes(TimeRange::DAY_START, 13 * 60));
|
||||||
|
self::assertSame('ab 13:00', (string) TimeRange::fromMinutes(13 * 60, TimeRange::DAY_END));
|
||||||
|
self::assertSame('09:00–13:00', (string) TimeRange::fromMinutes(9 * 60, 13 * 60));
|
||||||
|
self::assertSame('ganztägig', (string) TimeRange::wholeDay());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param list<TimeRange> $ranges
|
* @param list<TimeRange> $ranges
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in new issue
Block a user