A DeliveryCalendarService 4. prioritása a WorkCalendarService::isWorkDay()-t hívta, ami a naptárban nem szereplő napoknál a hétvégére esett vissza. Így egy hétvégét is tartalmazó sablon szombat/vasárnap mezőit sosem érte el a kiértékelés (5. prioritás), és csak egyedi felülbírálással lehetett hétvégi szállítást engedni. - WorkCalendarService: új isHoliday(), ami csak a work_calendars ünnepnap rekordjaira ad true-t, a naptári hétvégére nem. Az isWorkDay() változatlan. - DeliveryCalendarService: a 4. prioritás mostantól isHoliday()-t használ, így a hétvégéről a heti sablon dönt. Ünnepnap továbbra is tilt. - NextDeliveryDateCalculatorService: a szállítási nap keresése kikerült az isWorkDay() blokkból, különben a hétvége a következő szállítási nap számításánál továbbra is kimaradt volna. Az átfutási időbe az új countsTowardLeadTime() szerint a sablon hétvégi napjai is beleszámítanak, a H-P sablonok viselkedése változatlan. - DeliveryCalendarWidget: a szürke "inaktív" festés csak a nem szállítási hétvégékre megy rá. Mellékesen a szállítási napok ciklusa $date->addDay()-jel mutálta a kollekció Carbon objektumait, ez copy()-ra javítva. 7 új teszt, köztük a H-P sablon regresszió-őre. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
82 lines
2.6 KiB
PHP
82 lines
2.6 KiB
PHP
<?php
|
||
|
||
use App\Models\DeliverySchedule;
|
||
use App\Models\ProfitCenter;
|
||
use App\Models\ProfitCenterSupplierSchedule;
|
||
use App\Models\Supplier;
|
||
use App\Services\NextDeliveryDateCalculatorService;
|
||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||
use Illuminate\Support\Carbon;
|
||
use Tests\TestCase;
|
||
|
||
uses(TestCase::class, RefreshDatabase::class);
|
||
|
||
/**
|
||
* @param array<string, bool> $days
|
||
*/
|
||
function makeAssignment(array $days, bool $hasConstraint = true): array
|
||
{
|
||
$pc = ProfitCenter::factory()->create();
|
||
$supplier = Supplier::factory()->create([
|
||
'hasDeliveryConstraint' => $hasConstraint,
|
||
'orderCutOffTime' => 12,
|
||
'deliveryLeadTime' => 48, // 2 nap
|
||
]);
|
||
$schedule = DeliverySchedule::factory()->create($days);
|
||
ProfitCenterSupplierSchedule::factory()->create([
|
||
'profit_center_id' => $pc->id,
|
||
'supplier_id' => $supplier->id,
|
||
'delivery_schedule_id' => $schedule->id,
|
||
]);
|
||
|
||
return [$pc, $supplier];
|
||
}
|
||
|
||
const EVERY_DAY = [
|
||
'monday' => true,
|
||
'tuesday' => true,
|
||
'wednesday' => true,
|
||
'thursday' => true,
|
||
'friday' => true,
|
||
'saturday' => true,
|
||
'sunday' => true,
|
||
];
|
||
|
||
const WEEKDAYS_ONLY = [
|
||
'monday' => true,
|
||
'tuesday' => true,
|
||
'wednesday' => true,
|
||
'thursday' => true,
|
||
'friday' => true,
|
||
];
|
||
|
||
it('counts scheduled weekend days towards the lead time', function () {
|
||
[$pc, $supplier] = makeAssignment(EVERY_DAY);
|
||
|
||
$result = app(NextDeliveryDateCalculatorService::class)
|
||
->calculate($supplier->id, $pc->id, Carbon::parse('2026-04-17 08:00')); // Friday, cut-off előtt
|
||
|
||
// Péntek (1.) + szombat (2.) telik el az átfutásból, így vasárnap már szállítható.
|
||
expect($result?->toDateString())->toBe('2026-04-19'); // Sunday
|
||
});
|
||
|
||
it('does not count weekends for a weekday-only schedule', function () {
|
||
[$pc, $supplier] = makeAssignment(WEEKDAYS_ONLY);
|
||
|
||
$result = app(NextDeliveryDateCalculatorService::class)
|
||
->calculate($supplier->id, $pc->id, Carbon::parse('2026-04-17 08:00')); // Friday, cut-off előtt
|
||
|
||
// Péntek (1.) + hétfő (2.) telik el – a hétvége kimarad –, így kedd az első szállítási nap.
|
||
expect($result?->toDateString())->toBe('2026-04-21'); // Tuesday
|
||
});
|
||
|
||
it('returns a weekend day when there is no delivery constraint', function () {
|
||
[$pc, $supplier] = makeAssignment(EVERY_DAY, hasConstraint: false);
|
||
|
||
$result = app(NextDeliveryDateCalculatorService::class)
|
||
->calculate($supplier->id, $pc->id, Carbon::parse('2026-04-18 08:00')); // Saturday
|
||
|
||
// Átfutási idő nélkül a szombat maga az első szállítási nap.
|
||
expect($result?->toDateString())->toBe('2026-04-18'); // Saturday
|
||
});
|