75 lines
2.3 KiB
PHP
75 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace Modules\Core\Shipping\Carriers\Manual;
|
|
|
|
use Lunar\DataTypes\ShippingOption;
|
|
use Lunar\Shipping\DataTransferObjects\ShippingOptionRequest;
|
|
use Lunar\Shipping\Interfaces\ShippingRateInterface;
|
|
use Lunar\Shipping\Models\ShippingMethod;
|
|
use Lunar\Shipping\Models\ShippingRate;
|
|
use Modules\Core\Shipping\Concerns\ExcludesRestrictedProducts;
|
|
use Modules\Core\Shipping\Concerns\ResolvesFixedPricing;
|
|
use Modules\Core\Shipping\Contracts\DeclaresFulfillmentType;
|
|
use Modules\Core\Shipping\Contracts\SupportsCashCollection;
|
|
|
|
/**
|
|
* A carrier we have no integration with (e.g. Geniki), added by the
|
|
* merchant as a shipping method with this driver. The method's `data`
|
|
* holds the carrier's details, set in the admin
|
|
* (ShippingMethodResourceExtension):
|
|
*
|
|
* - carrier_name: shown to staff and customers on its shipments;
|
|
* - tracking_url: optional link template, `{number}` = the voucher number;
|
|
* - collects_cash: whether its courier takes cash on delivery.
|
|
*
|
|
* Priced like Store Pickup / Box Now (charge_by + price breaks); its
|
|
* shipments are created and tracked by hand (ManualFulfillmentService).
|
|
*/
|
|
class ManualRateDriver implements ShippingRateInterface, DeclaresFulfillmentType, SupportsCashCollection
|
|
{
|
|
use ResolvesFixedPricing;
|
|
use ExcludesRestrictedProducts;
|
|
|
|
public ShippingRate $shippingRate;
|
|
|
|
public function name(): string
|
|
{
|
|
return 'Manual carrier';
|
|
}
|
|
|
|
public function description(): string
|
|
{
|
|
return 'A carrier without an integration — shipments are entered and tracked by hand.';
|
|
}
|
|
|
|
public function fulfillmentType(): string
|
|
{
|
|
return 'carrier';
|
|
}
|
|
|
|
public function collectsCash(ShippingMethod $method): bool
|
|
{
|
|
return (bool) ($method->data['collects_cash'] ?? false);
|
|
}
|
|
|
|
public function resolve(ShippingOptionRequest $shippingOptionRequest): ?ShippingOption
|
|
{
|
|
if ($this->cartHasExcludedProducts($shippingOptionRequest->shippingRate, $shippingOptionRequest->cart)) {
|
|
return null;
|
|
}
|
|
|
|
return $this->resolveFixedPrice(
|
|
$shippingOptionRequest->shippingRate,
|
|
$shippingOptionRequest->shippingRate->shippingMethod,
|
|
$shippingOptionRequest->cart,
|
|
);
|
|
}
|
|
|
|
public function on(ShippingRate $shippingRate): self
|
|
{
|
|
$this->shippingRate = $shippingRate;
|
|
|
|
return $this;
|
|
}
|
|
}
|