ver. 0.306: hide transport methods with no available payment methods

When all payment methods for a transport are filtered out by
min_order_amount/max_order_amount limits, the transport is now hidden
from the basket. Prevents showing delivery options with empty payment
method lists (e.g. "Kurier - płatność przy odbiorze" when COD exceeds
max amount).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-22 17:09:38 +01:00
parent 2dc1360395
commit f16f5ce8f8
7 changed files with 244 additions and 6 deletions

View File

@@ -420,4 +420,197 @@ class TransportRepositoryTest extends TestCase
$this->assertEquals([], $repository->forPaymentMethod(0));
}
// =========================================================================
// transportMethodsFront — filtrowanie po dostępności form płatności
// =========================================================================
private function createMockDbForTransportMethodsFront(array $transports, array $paymentMethodsByTransportId): \medoo
{
$mockDb = $this->createMock(\medoo::class);
$mockDb->method('select')
->willReturn($transports);
$mockDb->method('query')
->willReturnCallback(function ($sql, $params) use ($paymentMethodsByTransportId) {
$transportId = $params[':transport_id'] ?? 0;
$rows = $paymentMethodsByTransportId[$transportId] ?? [];
return new class($rows) {
private $rows;
public function __construct($rows) { $this->rows = $rows; }
public function fetchAll() { return $this->rows; }
};
});
return $mockDb;
}
private function makeTransport(int $id, float $cost, int $deliveryFree = 0, $maxWp = null, int $default = 0): array
{
return [
'id' => (string)$id, 'name' => 'Transport ' . $id, 'name_visible' => '',
'description' => '', 'status' => '1', 'cost' => (string)$cost,
'max_wp' => $maxWp !== null ? (string)$maxWp : null,
'default' => (string)$default, 'delivery_free' => (string)$deliveryFree,
'apilo_carrier_account_id' => null, 'o' => (string)$id,
];
}
private function makePaymentMethod(int $id, $minAmount = null, $maxAmount = null): array
{
return [
'id' => $id, 'name' => 'Payment ' . $id, 'description' => '',
'status' => 1, 'apilo_payment_type_id' => null,
'min_order_amount' => $minAmount !== null ? (string)$minAmount : null,
'max_order_amount' => $maxAmount !== null ? (string)$maxAmount : null,
];
}
/**
* Transport z formą płatności przekraczającą max_order_amount powinien być ukryty
*/
public function testTransportMethodsFrontHidesTransportWhenAllPaymentsExceedMaxAmount(): void
{
global $settings;
$settings = ['free_delivery' => 9999];
$GLOBALS['mdb'] = $this->createMock(\medoo::class);
$transports = [
$this->makeTransport(1, 15.00, 0, null, 1),
$this->makeTransport(2, 20.00),
];
$paymentMethods = [
1 => [$this->makePaymentMethod(1)],
2 => [$this->makePaymentMethod(3, null, 10.00)],
];
$mockDb = $this->createMockDbForTransportMethodsFront($transports, $paymentMethods);
$repository = new TransportRepository($mockDb);
// Pusty koszyk: summaryPrice=0, transport 2 cost=20, order_total=20, max=10 → ukryty
$result = $repository->transportMethodsFront([], null);
$this->assertCount(1, $result);
$this->assertSame(1, $result[0]['id']);
}
/**
* Transport z formą płatności poniżej min_order_amount powinien być ukryty
*/
public function testTransportMethodsFrontHidesTransportWhenAllPaymentsBelowMinAmount(): void
{
global $settings;
$settings = ['free_delivery' => 9999];
$GLOBALS['mdb'] = $this->createMock(\medoo::class);
$transports = [
$this->makeTransport(1, 10.00, 0, null, 1),
$this->makeTransport(2, 10.00),
];
$paymentMethods = [
1 => [$this->makePaymentMethod(1)],
2 => [$this->makePaymentMethod(3, 100.00, null)],
];
$mockDb = $this->createMockDbForTransportMethodsFront($transports, $paymentMethods);
$repository = new TransportRepository($mockDb);
// Pusty koszyk: summaryPrice=0, transport 2 cost=10, order_total=10, min=100 → ukryty
$result = $repository->transportMethodsFront([], null);
$this->assertCount(1, $result);
$this->assertSame(1, $result[0]['id']);
}
/**
* Transport bez żadnych form płatności powinien być ukryty
*/
public function testTransportMethodsFrontHidesTransportWithNoPaymentMethods(): void
{
global $settings;
$settings = ['free_delivery' => 9999];
$GLOBALS['mdb'] = $this->createMock(\medoo::class);
$transports = [
$this->makeTransport(1, 10.00, 0, null, 1),
$this->makeTransport(2, 10.00),
];
$paymentMethods = [
1 => [$this->makePaymentMethod(1)],
2 => [],
];
$mockDb = $this->createMockDbForTransportMethodsFront($transports, $paymentMethods);
$repository = new TransportRepository($mockDb);
$result = $repository->transportMethodsFront([], null);
$this->assertCount(1, $result);
$this->assertSame(1, $result[0]['id']);
}
/**
* Oba transporty z dostępnymi płatnościami — oba widoczne
*/
public function testTransportMethodsFrontKeepsBothTransportsWhenPaymentsAvailable(): void
{
global $settings;
$settings = ['free_delivery' => 9999];
$GLOBALS['mdb'] = $this->createMock(\medoo::class);
$transports = [
$this->makeTransport(1, 10.00, 0, null, 1),
$this->makeTransport(2, 15.00),
];
$paymentMethods = [
1 => [$this->makePaymentMethod(1)],
2 => [$this->makePaymentMethod(2), $this->makePaymentMethod(3, 50.00, null)],
];
$mockDb = $this->createMockDbForTransportMethodsFront($transports, $paymentMethods);
$repository = new TransportRepository($mockDb);
// Transport 2 ma 2 płatności: jedna bez limitów (dostępna), druga z min=50 (niedostępna)
// Wystarczy 1 dostępna → transport widoczny
$result = $repository->transportMethodsFront([], null);
$this->assertCount(2, $result);
}
/**
* Transport z wieloma płatnościami — przynajmniej jedna dostępna = transport widoczny
*/
public function testTransportMethodsFrontKeepsTransportIfAtLeastOnePaymentAvailable(): void
{
global $settings;
$settings = ['free_delivery' => 9999];
$GLOBALS['mdb'] = $this->createMock(\medoo::class);
$transports = [
$this->makeTransport(1, 5.00, 0, null, 1),
];
// 3 płatności: 2 niedostępne (min za wysoki, max za niski), 1 dostępna (brak limitów)
$paymentMethods = [
1 => [
$this->makePaymentMethod(1, 100.00, null),
$this->makePaymentMethod(2, null, 1.00),
$this->makePaymentMethod(3),
],
];
$mockDb = $this->createMockDbForTransportMethodsFront($transports, $paymentMethods);
$repository = new TransportRepository($mockDb);
$result = $repository->transportMethodsFront([], null);
$this->assertCount(1, $result);
$this->assertSame(1, $result[0]['id']);
}
}