Skip to content

shouldBePaidUponDelivery() is hardcoded to 'cod' gateway — delivery_recipient_cost unusable with custom payment gateways #150

Description

@ipoint28

Окружение

  • CDEKDelivery: 5.1.0
  • WordPress / WooCommerce, классический чекаут
  • PHP 8.2
  • Платёжные шлюзы: WooCommerce Custom Payment Gateway Pro (ID шлюзов — генерируемые хеши, не cod)

Проблема

В src/Model/Order.php метод определения наложенного платежа жёстко привязан к ID стандартного шлюза WooCommerce:

final public function shouldBePaidUponDelivery(): bool
{
    return $this->payment_method === 'cod';
}

Он используется в src/Actions/OrderCreateAction.php (строка 253):

if ($this->order->shipping_total > 0 && $this->order->shouldBePaidUponDelivery()) {
    $param['delivery_recipient_cost'] = [
        'value' => $this->order->shipping_total + $this->order->shipping_tax,
    ];
}

В результате магазины с любым нестандартным платёжным шлюзом не могут воспользоваться полем delivery_recipient_cost: условие не выполняется никогда, поле в заказ не попадает, и стоимость доставки не выставляется получателю в пункте выдачи.

Схема у нас распространённая: товар оплачивается онлайн, доставка — получателем при выдаче. Штатными средствами плагина реализовать её нельзя — приходится патчить OrderCreateAction.php после каждого обновления.

Предлагаемое решение

Вариант 1 — настройка в админке

Добавить в настройки метода доставки мультиселект шлюзов, при которых доставку оплачивает получатель — по аналогии с уже существующей automate_wait_gateways. Механика полностью готова: список шлюзов собирается в SettingsFields.php, проверка делается через in_array($order->payment_method, ...) в DispatchOrderAutomationAction.php.

Вариант 2 — минимальный, WP-фильтр

final public function shouldBePaidUponDelivery(): bool
{
    return apply_filters(
        'cdek_should_be_paid_upon_delivery',
        $this->payment_method === 'cod',
        $this->order
    );
}

Одной строки достаточно, чтобы магазины решали задачу на своей стороне и не правили файлы плагина.

Любой из вариантов решит проблему. Готов протестировать на боевом магазине.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions