Mengapa total Pengiriman menetapkan row_weight dari item penawaran penjualan ke 0 jika pengiriman gratis berlaku?


21

Pendahuluan: Ini dimaksudkan untuk berfungsi sebagai observasi tertulis dari arsitektur Magento untuk komunitas (dan saya sendiri), serta pertanyaan aktual. Kami sedang bekerja dengan pengalaman kereta dan checkout yang sangat dimodifikasi, tetapi akar masalah ini adalah dalam logika inti Magento.

Latar Belakang

Kami telah membuat kupon pengiriman gratis menggunakan fungsionalitas aturan harga keranjang belanja standar. Tidak ada ketentuan pada kupon, dan satu-satunya tindakan adalah yang Free Shippingdiatur ke For matching items only. Karena tidak ada kondisi, ini akan ditetapkanfree_shipping ke1 untuk semua item kutipan penjualan.

Seperti kebiasaan, kami juga telah mengaktifkan metode pengiriman Pengiriman Gratis. Model Freeshippingoperator akan memberikan tarif setiap kali permintaan pengiriman gratis atau subtotal cocok atau melebihi ambang batas (tetapi kami tidak menggunakan opsi ambang batas). Lihat Mage_Shipping_Model_Carrier_Freeshipping::collectRates:

$this->_updateFreeMethodQuote($request);

if (($request->getFreeShipping()) // <-- This is the condition we're relying on
    || ($request->getBaseSubtotalInclTax() >=
        $this->getConfigData('free_shipping_subtotal'))
) {
    /* Snip: Add $0.00 method to the result */
}

Dan Mage_Shipping_Model_Carrier_Freeshipping::_updateFreeMethodQuoteterlihat seperti ini:

protected function _updateFreeMethodQuote($request)
{
    $freeShipping = false;
    $items = $request->getAllItems();
    $c = count($items);
    for ($i = 0; $i < $c; $i++) {
        if ($items[$i]->getProduct() instanceof Mage_Catalog_Model_Product) {
            if ($items[$i]->getFreeShipping()) {
                $freeShipping = true;
            } else {
                return;
            }
        }
    }
    if ($freeShipping) {
        $request->setFreeShipping(true);
    }
}

Jadi, selama semua item telah free_shippingditetapkan ke nilai yang sebenarnya (karena mereka akan, karena kupon), kita harus mendapatkan pengiriman gratis. Dan kami melakukannya!

Masalah

Namun, ada efek samping utama: metode pengiriman apa pun yang bergantung pada item row_weight(seperti halnya dengan versi kustom dari operator FedEx kami) akan gagal menghitung tarif pengiriman yang tepat karena setiap item row_weightdiatur ke0 saat pengiriman gratis aktif.

Yang cukup menarik, tidak satu pun dari operator pengiriman default Magento yang benar-benar bergantung row_weight, tetapi kita akan membahasnya setelah kita mencari tahu mengapa / kapan row_weightdiatur ke0 .

Mencari tahu mengapa row_weightdiatur ke0

Bagian ini sebenarnya cukup mudah digali. Sejumlah besar perhitungan pengiriman terjadi di Mage_Sales_Model_Quote_Address_Total_Shipping::collect, termasuk pengaturan row_weightuntuk 0:

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

    foreach ($items as $item) {
        /* Snip: Handling virtual items and parent items */

        if ($item->getHasChildren() && $item->isShipSeparately()) {
            /* Snip: Handling items with children */
        }
        else {
            if (!$item->getProduct()->isVirtual()) {
                $addressQty += $item->getQty();
            }
            $itemWeight = $item->getWeight();
            $rowWeight  = $itemWeight*$item->getQty();
            $addressWeight+= $rowWeight;
            if ($freeAddress || $item->getFreeShipping()===true) {
                $rowWeight = 0;
            } elseif (is_numeric($item->getFreeShipping())) {
                $freeQty = $item->getFreeShipping();
                if ($item->getQty()>$freeQty) {
                    $rowWeight = $itemWeight*($item->getQty()-$freeQty);
                }
                else {
                    $rowWeight = 0;
                }
            }
            $freeMethodWeight+= $rowWeight;
            $item->setRowWeight($rowWeight);
        }
    }

Mengapa ini tidak memengaruhi operator bawaan Magento

Jika Anda melakukan pencarian regex untuk /row_?weight/i(misalnya getRowWeight, setRowWeight, setData('row_weight'), dll) di Mage_Shipping(operator sederhana) danMage_Usa (FedEx, UPS, dan beberapa operator lain), tidak ada yang muncul. Mengapa? Karena operator default menggunakan berat alamat total, bukan bobot masing-masing item.

Sebagai contoh, mari kita lihat Mage_Usa_Model_Shipping_Carrier_Fedex::setRequest:

public function setRequest(Mage_Shipping_Model_Rate_Request $request)
{
    $this->_request = $request;

    $r = new Varien_Object();

    /* Snip */

    $weight = $this->getTotalNumOfBoxes($request->getPackageWeight());
    $r->setWeight($weight);
    if ($request->getFreeMethodWeight()!= $request->getPackageWeight()) {
        $r->setFreeMethodWeight($request->getFreeMethodWeight());
    }

Dan dari mana permintaan mendapatkan berat paket? Jawabannya ada di Mage_Sales_Model_Quote_Address::requestShippingRates:

public function requestShippingRates(Mage_Sales_Model_Quote_Item_Abstract $item = null)
{
    /** @var $request Mage_Shipping_Model_Rate_Request */
    $request = Mage::getModel('shipping/rate_request');
    /* Snip */
    $request->setPackageWeight($item ? $item->getRowWeight() : $this->getWeight());

Kami dapat mengabaikan penggunaan di $item->getRowWeight()sini karena requestShippingRatesdipanggil tanpa memberikan item tertentu sebagai parameter di Mage_Sales_Model_Quote_Address_Total_Shipping::collect:

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

    foreach ($items as $item) {
        /* Snip: Handling virtual items and parent items */

        if ($item->getHasChildren() && $item->isShipSeparately()) {
            /* Snip: Handling items with children */
        }
        else {
            if (!$item->getProduct()->isVirtual()) {
                $addressQty += $item->getQty();
            }
            $itemWeight = $item->getWeight();
            $rowWeight  = $itemWeight*$item->getQty();
            $addressWeight+= $rowWeight;
            if ($freeAddress || $item->getFreeShipping()===true) {
                $rowWeight = 0;
            } elseif (is_numeric($item->getFreeShipping())) {
                $freeQty = $item->getFreeShipping();
                if ($item->getQty()>$freeQty) {
                    $rowWeight = $itemWeight*($item->getQty()-$freeQty);
                }
                else {
                    $rowWeight = 0;
                }
            }
            $freeMethodWeight+= $rowWeight;
            $item->setRowWeight($rowWeight);
        }
    }

    $address->setWeight($addressWeight);
    $address->setFreeMethodWeight($freeMethodWeight);

    $address->collectShippingRates();

Ini seharusnya terlihat akrab, karena ini adalah tempat yang sama dengan setiap item row_weightdiatur 0jika pengiriman gratis berlaku. Perhatikan bagaimana $addressWeightmeringkas setiap item $rowWeight, tetapi hal itu dilakukan sebelum row_weightdiatur ke0 .

Pada dasarnya, bobot alamat akan selalu menjadi berat total semua item, terlepas dari free_shippingnilai setiap item. Karena operator bawaan Magento hanya mengandalkan bobot alamat, masalah dengan row_weighttidak muncul.

Jadi mengapa kita perlu row_weight

Kita butuh row_weight karena kami telah menyesuaikan pembawa FedEx Magento untuk menghitung tarif terpisah untuk item yang berasal dari asal yang berbeda, bahkan jika mereka pergi ke tujuan yang sama (dan karenanya merupakan bagian dari alamat yang sama). Misalnya, jika Anda tinggal di NJ, lebih murah (dan lebih cepat) untuk mengirim barang dari NJ daripada dari CA - dan jika Anda memiliki barang dari NJ dan CA dalam pesanan Anda, Anda dapat melihat biaya (dan perkiraan tanggal pengiriman) dari setiap pengiriman.

Secara keseluruhan, sepertinya kita dapat dengan mudah mengatasi masalah ini dengan mengabaikan row_weightdan menggunakan weight * qtysecara langsung. Tapi, itu menuntun kita ke:

Pertanyaan

Mengapa Shippingtotal mengatur row_weightitem kutipan penjualan 0jika pengiriman gratis berlaku? Ini tampaknya tidak digunakan di mana pun.

Pengamatan lebih lanjut

Saya lupa menyebutkan bahwa row_weightsebenarnya bisa menjadi nol, tetapi masih kurang dari weight * qty, jika free_shippingangka bukan true. Saya berasumsi tujuan dari ini adalah untuk memberikan solusi untuk skenario seperti ini:

Saya memiliki 3 item produk yang sama di troli saya, masing-masing item dengan berat 2 lbs. Saya menerapkan kupon pengiriman gratis, tetapi terbatas pada jumlah 2, jadi itu hanya berlaku untuk 2 item. Sekarang, ketika saya melihat tarif pengiriman, saya akan melihat tarif pengiriman untuk 2 lbs (2 + 0 + 0) daripada 6 lbs (2 + 2 + 2).

Ini tampaknya masuk akal, tetapi ada dua masalah utama:

  • Tak satu pun dari operator Magento default berfungsi seperti ini (mereka menggunakan berat total alamat, lihat di atas).

  • Bahkan jika beberapa operator bekerja seperti ini, itu berarti saya bisa memilih metode pengiriman apa pun (mis. Pengiriman semalam) dan hanya membayar untuk berat 1 barang - artinya, pedagang harus menanggung biaya 2 barang lainnya . Terserah pedagang untuk entah bagaimana mengetahui bahwa saya hanya membayar untuk berat 1 item, dan kemudian mengirimkan 2 item lainnya menggunakan metode yang lebih hemat biaya, secara efektif menciptakan ketidakcocokan antara apa yang ditampilkan Magento dan bagaimana item sebenarnya dikirim keluar.


Heh, tidak ada yang mengambil? :)
Agop

Begitu banyak suara, begitu sedikit diskusi! Begitulah kehidupan pengembangan Magento.
Agop

Jawaban:


2

Kupikir aku akan menikam ini ...;)

Cukup pertanyaan menarik yang Anda ajukan di sini jadi inilah mengapa saya pikir mereka melakukannya, namun saya masih berusaha melacak ketika kasing khusus ini mulai dimainkan.

Meninjau metode operator USPS, sepertinya Permintaan Internasional ke API mereka memberikan bobot item untuk setiap produk. Ini adalah satu-satunya operator yang dapat saya temukan yang melakukan ini. Temukan metode lengkap di bawah ini, dan bagian yang disorot di bawahnya.

protected function _formIntlShipmentRequest(Varien_Object $request)
    {
        $packageParams = $request->getPackageParams();
        $height = $packageParams->getHeight();
        $width = $packageParams->getWidth();
        $length = $packageParams->getLength();
        $girth = $packageParams->getGirth();
        $packageWeight = $request->getPackageWeight();
        if ($packageParams->getWeightUnits() != Zend_Measure_Weight::POUND) {
            $packageWeight = Mage::helper('usa')->convertMeasureWeight(
                $request->getPackageWeight(),
                $packageParams->getWeightUnits(),
                Zend_Measure_Weight::POUND
            );
        }
        if ($packageParams->getDimensionUnits() != Zend_Measure_Length::INCH) {
            $length = round(Mage::helper('usa')->convertMeasureDimension(
                $packageParams->getLength(),
                $packageParams->getDimensionUnits(),
                Zend_Measure_Length::INCH
            ));
            $width = round(Mage::helper('usa')->convertMeasureDimension(
                $packageParams->getWidth(),
                $packageParams->getDimensionUnits(),
                Zend_Measure_Length::INCH
            ));
            $height = round(Mage::helper('usa')->convertMeasureDimension(
                $packageParams->getHeight(),
                $packageParams->getDimensionUnits(),
                Zend_Measure_Length::INCH
            ));
        }
        if ($packageParams->getGirthDimensionUnits() != Zend_Measure_Length::INCH) {
            $girth = round(Mage::helper('usa')->convertMeasureDimension(
                $packageParams->getGirth(),
                $packageParams->getGirthDimensionUnits(),
                Zend_Measure_Length::INCH
            ));
        }

        $container = $request->getPackagingType();
        switch ($container) {
            case 'VARIABLE':
                $container = 'VARIABLE';
                break;
            case 'FLAT RATE ENVELOPE':
                $container = 'FLATRATEENV';
                break;
            case 'FLAT RATE BOX':
                $container = 'FLATRATEBOX';
                break;
            case 'RECTANGULAR':
                $container = 'RECTANGULAR';
                break;
            case 'NONRECTANGULAR':
                $container = 'NONRECTANGULAR';
                break;
            default:
                $container = 'VARIABLE';
        }
        $shippingMethod = $request->getShippingMethod();
        list($fromZip5, $fromZip4) = $this->_parseZip($request->getShipperAddressPostalCode());

        // the wrap node needs for remove xml declaration above
        $xmlWrap = new SimpleXMLElement('<?xml version = "1.0" encoding = "UTF-8"?><wrap/>');
        $method = '';
        $service = $this->getCode('service_to_code', $shippingMethod);
        if ($service == 'Priority') {
            $method = 'Priority';
            $rootNode = 'PriorityMailIntlRequest';
            $xml = $xmlWrap->addChild($rootNode);
        } else if ($service == 'First Class') {
            $method = 'FirstClass';
            $rootNode = 'FirstClassMailIntlRequest';
            $xml = $xmlWrap->addChild($rootNode);
        } else {
            $method = 'Express';
            $rootNode = 'ExpressMailIntlRequest';
            $xml = $xmlWrap->addChild($rootNode);
        }

        $xml->addAttribute('USERID', $this->getConfigData('userid'));
        $xml->addAttribute('PASSWORD', $this->getConfigData('password'));
        $xml->addChild('Option');
        $xml->addChild('Revision', self::DEFAULT_REVISION);
        $xml->addChild('ImageParameters');
        $xml->addChild('FromFirstName', $request->getShipperContactPersonFirstName());
        $xml->addChild('FromLastName', $request->getShipperContactPersonLastName());
        $xml->addChild('FromFirm', $request->getShipperContactCompanyName());
        $xml->addChild('FromAddress1', $request->getShipperAddressStreet2());
        $xml->addChild('FromAddress2', $request->getShipperAddressStreet1());
        $xml->addChild('FromCity', $request->getShipperAddressCity());
        $xml->addChild('FromState', $request->getShipperAddressStateOrProvinceCode());
        $xml->addChild('FromZip5', $fromZip5);
        $xml->addChild('FromZip4', $fromZip4);
        $xml->addChild('FromPhone', $request->getShipperContactPhoneNumber());
        if ($method != 'FirstClass') {
            if ($request->getReferenceData()) {
                $referenceData = $request->getReferenceData() . ' P' . $request->getPackageId();
            } else {
                $referenceData = $request->getOrderShipment()->getOrder()->getIncrementId()
                                 . ' P'
                                 . $request->getPackageId();
            }
            $xml->addChild('FromCustomsReference', 'Order #' . $referenceData);
        }
        $xml->addChild('ToFirstName', $request->getRecipientContactPersonFirstName());
        $xml->addChild('ToLastName', $request->getRecipientContactPersonLastName());
        $xml->addChild('ToFirm', $request->getRecipientContactCompanyName());
        $xml->addChild('ToAddress1', $request->getRecipientAddressStreet1());
        $xml->addChild('ToAddress2', $request->getRecipientAddressStreet2());
        $xml->addChild('ToCity', $request->getRecipientAddressCity());
        $xml->addChild('ToProvince', $request->getRecipientAddressStateOrProvinceCode());
        $xml->addChild('ToCountry', $this->_getCountryName($request->getRecipientAddressCountryCode()));
        $xml->addChild('ToPostalCode', $request->getRecipientAddressPostalCode());
        $xml->addChild('ToPOBoxFlag', 'N');
        $xml->addChild('ToPhone', $request->getRecipientContactPhoneNumber());
        $xml->addChild('ToFax');
        $xml->addChild('ToEmail');
        if ($method != 'FirstClass') {
            $xml->addChild('NonDeliveryOption', 'Return');
        }
        if ($method == 'FirstClass') {
            if (stripos($shippingMethod, 'Letter') !== false) {
                $xml->addChild('FirstClassMailType', 'LETTER');
            } else if (stripos($shippingMethod, 'Flat') !== false) {
                $xml->addChild('FirstClassMailType', 'FLAT');
            } else{
                $xml->addChild('FirstClassMailType', 'PARCEL');
            }
        }
        if ($method != 'FirstClass') {
            $xml->addChild('Container', $container);
        }
        $shippingContents = $xml->addChild('ShippingContents');
        $packageItems = $request->getPackageItems();
        // get countries of manufacture
        $countriesOfManufacture = array();
        $productIds = array();
        foreach ($packageItems as $itemShipment) {
                $item = new Varien_Object();
                $item->setData($itemShipment);

                $productIds[]= $item->getProductId();
        }
        $productCollection = Mage::getResourceModel('catalog/product_collection')
            ->addStoreFilter($request->getStoreId())
            ->addFieldToFilter('entity_id', array('in' => $productIds))
            ->addAttributeToSelect('country_of_manufacture');
        foreach ($productCollection as $product) {
            $countriesOfManufacture[$product->getId()] = $product->getCountryOfManufacture();
        }

        $packagePoundsWeight = $packageOuncesWeight = 0;
        // for ItemDetail
        foreach ($packageItems as $itemShipment) {
            $item = new Varien_Object();
            $item->setData($itemShipment);

            $itemWeight = $item->getWeight() * $item->getQty();
            if ($packageParams->getWeightUnits() != Zend_Measure_Weight::POUND) {
                $itemWeight = Mage::helper('usa')->convertMeasureWeight(
                    $itemWeight,
                    $packageParams->getWeightUnits(),
                    Zend_Measure_Weight::POUND
                );
            }
            if (!empty($countriesOfManufacture[$item->getProductId()])) {
                $countryOfManufacture = $this->_getCountryName(
                    $countriesOfManufacture[$item->getProductId()]
                );
            } else {
                $countryOfManufacture = '';
            }
            $itemDetail = $shippingContents->addChild('ItemDetail');
            $itemDetail->addChild('Description', $item->getName());
            $ceiledQty = ceil($item->getQty());
            if ($ceiledQty < 1) {
                $ceiledQty = 1;
            }
            $individualItemWeight = $itemWeight / $ceiledQty;
            $itemDetail->addChild('Quantity', $ceiledQty);
            $itemDetail->addChild('Value', $item->getCustomsValue() * $item->getQty());
            list($individualPoundsWeight, $individualOuncesWeight) = $this->_convertPoundOunces($individualItemWeight);
            $itemDetail->addChild('NetPounds', $individualPoundsWeight);
            $itemDetail->addChild('NetOunces', $individualOuncesWeight);
            $itemDetail->addChild('HSTariffNumber', 0);
            $itemDetail->addChild('CountryOfOrigin', $countryOfManufacture);

            list($itemPoundsWeight, $itemOuncesWeight) = $this->_convertPoundOunces($itemWeight);
            $packagePoundsWeight += $itemPoundsWeight;
            $packageOuncesWeight += $itemOuncesWeight;
        }
        $additionalPackagePoundsWeight = floor($packageOuncesWeight / self::OUNCES_POUND);
        $packagePoundsWeight += $additionalPackagePoundsWeight;
        $packageOuncesWeight -= $additionalPackagePoundsWeight * self::OUNCES_POUND;
        if ($packagePoundsWeight + $packageOuncesWeight / self::OUNCES_POUND < $packageWeight) {
            list($packagePoundsWeight, $packageOuncesWeight) = $this->_convertPoundOunces($packageWeight);
        }

        $xml->addChild('GrossPounds', $packagePoundsWeight);
        $xml->addChild('GrossOunces', $packageOuncesWeight);
        if ($packageParams->getContentType() == 'OTHER' && $packageParams->getContentTypeOther() != null) {
            $xml->addChild('ContentType', $packageParams->getContentType());
            $xml->addChild('ContentTypeOther ', $packageParams->getContentTypeOther());
        } else {
            $xml->addChild('ContentType', $packageParams->getContentType());
        }

        $xml->addChild('Agreement', 'y');
        $xml->addChild('ImageType', 'PDF');
        $xml->addChild('ImageLayout', 'ALLINONEFILE');
        if ($method == 'FirstClass') {
            $xml->addChild('Container', $container);
        }
        // set size
        if ($packageParams->getSize()) {
            $xml->addChild('Size', $packageParams->getSize());
        }
        // set dimensions
        $xml->addChild('Length', $length);
        $xml->addChild('Width', $width);
        $xml->addChild('Height', $height);
        if ($girth) {
            $xml->addChild('Girth', $girth);
        }

        $xml = $xmlWrap->{$rootNode}->asXML();
        return $xml;
    }

Bagian tertentu:

$packagePoundsWeight = $packageOuncesWeight = 0;
        // for ItemDetail
        foreach ($packageItems as $itemShipment) {
            $item = new Varien_Object();
            $item->setData($itemShipment);

            $itemWeight = $item->getWeight() * $item->getQty();
            if ($packageParams->getWeightUnits() != Zend_Measure_Weight::POUND) {
                $itemWeight = Mage::helper('usa')->convertMeasureWeight(
                    $itemWeight,
                    $packageParams->getWeightUnits(),
                    Zend_Measure_Weight::POUND
                );
            }
            if (!empty($countriesOfManufacture[$item->getProductId()])) {
                $countryOfManufacture = $this->_getCountryName(
                    $countriesOfManufacture[$item->getProductId()]
                );
            } else {
                $countryOfManufacture = '';
            }
            $itemDetail = $shippingContents->addChild('ItemDetail');
            $itemDetail->addChild('Description', $item->getName());
            $ceiledQty = ceil($item->getQty());
            if ($ceiledQty < 1) {
                $ceiledQty = 1;
            }
            $individualItemWeight = $itemWeight / $ceiledQty;
            $itemDetail->addChild('Quantity', $ceiledQty);
            $itemDetail->addChild('Value', $item->getCustomsValue() * $item->getQty());
            list($individualPoundsWeight, $individualOuncesWeight) = $this->_convertPoundOunces($individualItemWeight);
            $itemDetail->addChild('NetPounds', $individualPoundsWeight);
            $itemDetail->addChild('NetOunces', $individualOuncesWeight);
            $itemDetail->addChild('HSTariffNumber', 0);
            $itemDetail->addChild('CountryOfOrigin', $countryOfManufacture);

            list($itemPoundsWeight, $itemOuncesWeight) = $this->_convertPoundOunces($itemWeight);
            $packagePoundsWeight += $itemPoundsWeight;
            $packageOuncesWeight += $itemOuncesWeight;
        }

Bagi saya, tampaknya Magento menghitung ulang berat paket berdasarkan bobot item yang sebenarnya, dan tidak meningkatkan berat alamat. Saya ingin tahu apakah paket barang yang diloloskan tidak memiliki bobotnya nol, karena itu akan menyebabkan bobot barang palsu mengingat respons tarif akan didasarkan pada data bobot buruk.

Tembakan dalam gelap sekalipun.


1

Saya juga telah menusuk ini dan saya menemukan sesuatu yang menarik dari baris kode ini

$item->setRowWeight($rowWeight);

diperkenalkan pada versi 1.1.5 sebelum itu fungsinya seperti ini.

Magento Mirror Import Magento Release 1.1.5 - Shipping.php

Magento Mirror Import Magento Release 1.1.1 - Shipping.php

            else {
            if (!$item->getProduct()->getTypeInstance()->isVirtual()) {
                $addressQty += $item->getQty();
            }
            $itemWeight = $item->getWeight();
            $rowWeight  = $itemWeight*$item->getQty();
            $addressWeight+= $rowWeight;
            if ($freeAddress || $item->getFreeShipping()===true) {
                $rowWeight = 0;
            } elseif (is_numeric($item->getFreeShipping())) {
                $freeQty = $item->getFreeShipping();
                if ($item->getQty()>$freeQty) {
                    $rowWeight = $itemWeight*($item->getQty()-$freeQty);
                }
                else {
                    $rowWeight = 0;
                }
            }
            $freeMethodWeight+= $rowWeight;
        }
    }

Pemahaman saya adalah bahwa Mage_Sales_Model_Quote_Address_Total_Shipping :: kumpulkan kebutuhan untuk menghitung / memperbarui $ addressWeight dan $ freeMethodWeight

    $addressWeight      = $address->getWeight();
    $freeMethodWeight   = $address->getFreeMethodWeight();

dan $ item-> setRowWeight tidak boleh digunakan di sini karena terkait dengan item tidak dengan kutipan dan alamat.

Taruhan saya adalah ini adalah kesalahan. Mungkin row_total tidak pernah dimaksudkan untuk digunakan dalam metode pengiriman itu sebabnya modul default tidak menggunakannya.

Saya tidak dapat melacak perubahan log yang dapat menjelaskan mengapa ini diperkenalkan di v 1.1.5.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.