magento - доставка по нескольким адресам, но с сохранением оплаты до одного заряда - PullRequest
7 голосов
/ 28 февраля 2012

Я пытаюсь найти способ разделить заказ по нескольким адресам доставки, но оставить покупателю плату за единовременный платеж, а не взимать плату за каждую партию отдельно.Есть ли способ сделать это?В настоящее время с клиентов взимается плата в несколько раз, что соответствует их «множественным заказам», поскольку magento разделяет заказы на множество мелких заказов.Это проблема со стороны компании, выпускающей кредитные карты, так как они начинают подозревать, что с карты слишком много последовательных платежей.Есть идеи?

Ответы [ 2 ]

3 голосов
/ 22 августа 2013

Что ж, я не смогу предоставить полное решение, потому что, если честно, решение потребует немало времени и тестирования, но я предоставлю исчерпывающую информацию, которая поможет вам в правильном направлении. .

По сути, аванс - нет возможности сделать это в Magento по умолчанию.

Итак, вместо этого мы собираемся переписать определенную модель с именем Mage_Checkout_Model_Type_Multishipping. Если вы не знаете, как правильно переписать модель, прочитайте этот пост Inchoo .

Но если вы ленивы и ищете быстрый способ переписать, то, пожалуйста, скопируйте весь файл app/code/core/Mage/Checkout/Model/Type/Multishipping.php в app/code/local/Mage/Checkout/Model/Type/Multishipping.php

После того, как вы закончили любое из двух выше, вы можете переписать то, что нам нужно, в этот класс. Проверьте функцию около line 498:

public function createOrders()
{
    $orderIds = array();
    $this->_validate();
    $shippingAddresses = $this->getQuote()->getAllShippingAddresses();
    $orders = array();

    if ($this->getQuote()->hasVirtualItems()) {
        $shippingAddresses[] = $this->getQuote()->getBillingAddress();
    }

    try {
        foreach ($shippingAddresses as $address) {
            $order = $this->_prepareOrder($address);

            $orders[] = $order;
        ....
        } 

    foreach ($orders as $order) {
            $order->place();
            $order->save();
       ...
    }

    ....

    Mage::dispatchEvent('checkout_submit_all_after', array('orders' => $orders, 'quote' => $this->getQuote()));

        return $this;
    } catch (Exception $e) {
        Mage::dispatchEvent('checkout_multishipping_refund_all', array('orders' => $orders));
        throw $e;
    }
 }

Таким образом, мы ясно видим, что он пытается создать заказ для каждого адреса, а затем (наиболее важная часть) запускает событие checkout_submit_all_after, которое отслеживается платежными модулями (информация о заказе и котировках передается всем доступных / активных модулей оплаты и метода оплаты, указанного в предложении, определит, сможет ли определенный модуль оплаты, получивший отправленное событие, обработать его или нет).

Имея это в виду, вы можете иметь несколько вариантов:

1.) Если вы можете жить только с одним заказом, попробуйте переписать подпрограмму createOrders, чтобы просто снова объединить все элементы в один заказ, ->place() это, а затем перейти к dispatchEvent для хорошей меры.

2.) Если вам нужно несколько заказов, хорошо - это то, где это становится запутанным, так как есть небольшой шанс, что вы можете сделать одно из следующих действий:

  • сначала создайте платеж, затем свяжите его с заказами (это практически невозможно)
  • создайте заказы и другой «комбинированный» заказ, в котором вы перейдете в dispatchEvent. звучит грязно и / или неправильно, так что не беспокойтесь, может быть?

Так что, да, вы, ребята, здесь очень много просите, поэтому лучшее, что я могу сделать, это пролить свет на то, где вы можете сначала нанести серьезный ущерб. Я бы сделал это сам, но здесь он выше моей зарплаты.

Некоторые дополнительные указатели:

  • Следите за методами сеанса сразу после создания заказа, знайте, куда они тоже ведут
  • Также будьте осторожны со всеми отправленными событиями. У всех них есть цель, почему они там и где они находятся.

Удачи!

1 голос
/ 02 марта 2012

Убедитесь, что эта опция включена:

enter image description here

Если я не ошибаюсь, когда клиент нажимает кнопку оформления одной страницы, ему не будет показана опция доставки по нескольким адресам. Но если он нажмет на основную кнопку оформления заказа, это произойдет.

...