Magento upfront payment

2020-08-05 10:05发布

问题:

For a future project we have been assigned to create a simple concept (inside Magento) that would has to do the following:

A customer has the ability to choose between different shipping methods, one of them being "Ship2Shop", which sends the product to a physical store of choice and the customer has to go an pick it up. When a customer selects this "ship2shop" shipping method, a certain percentage (eg: 25%) of the total amount has to be paid online (via a pre-defined payment method) and the remaining 75% has to be paid in the physical store when the customer goes and pick up the products he ordered.

How would you go about this?

Idea that we were having is modify the checkout/order session and modify the "grand total" amount (saving the original in a session ofcourse). When the customer is then sent to the external payment processor the "modified grand total" is sent along. Once the customer returns on the magento platform we would modify the order by restoring the original grand total the way it was and updating the total paid and total due amount.

Anyone got any other ideas about this?

EDIT: After feedback from Anton S below I managed to add an "advance payment total". However Im still having a problem In the config.xml I have added the following in the tag:

acsystems_advancepayment/total_custom grand_total

I want my advance payment to show AFTER the grand total, for some reason, magento won't do that...

EDIT2: Collect method

public function collect(Mage_Sales_Model_Quote_Address $address)
    {
        parent::collect($address);

        $quote = $address->getQuote();
        $advancePaymentAmount = 0;
        $baseAdvancePaymentAmount = 0;

        $items = $address->getAllItems();
        if (!count($items)) {
            $address->setAdvancePaymentAmount($advancePaymentAmount);
            $address->setBaseAdvancePaymentAmount($baseAdvancePaymentAmount);
            return $this;
        }

        $address->setBaseAdvancePayment($address->getGrandTotal()*(0.25));
        $address->setAdvancePayment($address->getGrandTotal()*(0.25));
        $address->setAdvancePaymentAmount($address->getGrandTotal()*(0.25));
        $address->setBaseAdvancePaymentAmount($address->getGrandTotal()*(0.25));
        $address->setGrandTotal($address->getGrandTotal() - $address->getAdvancePaymentAmount());
        $address->setBaseGrandTotal($address->getBaseGrandTotal()-$address->getBaseAdvancePaymentAmount());

        return $this;
    }

回答1:

refer to this thread where adding total objects is explained Magento: adding duties/taxes to a quote during review

Basically you should add your own total object based on your shipping method selection, then it will also be shown in totals as separate row and you can show this in every e-mail or place where totals are exposed

public function collect(Mage_Sales_Model_Quote_Address $address)
{

    //this is for the loop that you are in when totals are collected 
    parent::collect($address);

    $quote = $address->getQuote();

    //variables for your own object context
    $advancePaymentAmount = 0;
    $baseAdvancePaymentAmount = 0;

    $items = $address->getAllItems();
    if (!count($items)) {
        $address->setAdvancePaymentAmount($advancePaymentAmount);
        $address->setBaseAdvancePaymentAmount($baseAdvancePaymentAmount);
        return $this;
    }

    //calculated based on other total object and don't edit other totals inside your own as your calculations would be always false and so would be next total object in the cycle and so on
    $baseAdvancePaymentAmount = $address->getBaseGrandTotal()*(0.25);
    $advancePaymentAmount = $address->getQuote()->getStore()->convertPrice($baseAdvancePaymentAmount, false);

    //this is just for your own object context
    $address->setBaseAdvancePaymentAmount($baseAdvancePaymentAmount);
    $address->setAdvancePaymentAmount($advancePaymentAmount);

    /* 
     * this is for the loop that you are in when totals are collected and 
     * those are set to 0 for each totals collecting cycle 
     */

    $this->_setBaseAmount($baseAdvancePaymentAmount);
    $this->_setAmount($advancePaymentAmount);

    return $this;
}


回答2:

Another option is to change the "grand_total" in your payment module, that way the sessions aren't altered..