কেন শিপিং মোট বিক্রয় শুল্ক কার্যকর হয় যদি বিক্রয় কোট আইটেমের সারি_ ওজন 0 সেট করে?


21

উপস্থাপনা: এটি সম্প্রদায়ের (এবং আমার) জন্য ম্যাজেন্টোর স্থাপত্যের লিখিত পর্যবেক্ষণ, পাশাপাশি একটি আসল প্রশ্ন উভয় হিসাবে পরিবেশন করা। আমরা একটি ভারী পরিবর্তিত কার্ট এবং চেকআউট অভিজ্ঞতা নিয়ে কাজ করছি, তবে এই সমস্যার মূলে রয়েছে ম্যাগান্তোর মূল যুক্তি।

পটভূমি

আমরা স্ট্যান্ডার্ড শপিং কার্টের মূল্য বিধি কার্যকারিতা ব্যবহার করে একটি নিখরচায় শিপিং কুপন তৈরি করেছি। কুপনে কোনও শর্ত নেই এবং কেবলমাত্র অ্যাকশন Free Shippingসেট করা আছে For matching items only। যেহেতু কোনও শর্ত নেই, তাই এটি সেট free_shippingহয়ে যাবে1 এটি বিক্রয় কোট আইটেমগুলির জন্য ।

প্রচলিত হিসাবে, আমরা ফ্রি শিপিং শিপিং পদ্ধতিটিও সক্ষম করেছি। Freeshippingক্যারিয়ারের মডেল হার প্রদান করবে যখনই অনুরোধ ফ্রি শিপিং বা উপসমষ্টি ম্যাচ আছে বা থ্রেশহোল্ড অতিক্রম করে (কিন্তু আমরা থ্রেশহোল্ড বিকল্প ব্যবহার করছেন না)। দেখুন 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 */
}

এবং এর Mage_Shipping_Model_Carrier_Freeshipping::_updateFreeMethodQuoteমতো দেখাচ্ছে:

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);
    }
}

সুতরাং, যতক্ষণ না সমস্ত আইটেম free_shippingসত্যের মান সেট করেছে (যা তারা কুপনের কারণে হবে), আমাদের নিখরচায় শিপিং করা উচিত। এবং আমরা কি!

সমস্যাটি

তবে, এর একটি বড় পার্শ্ব প্রতিক্রিয়া রয়েছে: যে কোনও শিপিং পদ্ধতি যা কোনও আইটেমের উপর নির্ভর করে row_weight(যেমনটি আমাদের ফেডেক্স ক্যারিয়ারের নিজস্ব কাস্টমাইজড সংস্করণে হয়) উপযুক্ত শিপিং হারগুলি গণনা করতে ব্যর্থ হবে কারণ ফ্রি শিপিং সক্রিয় থাকাকালীন প্রতিটি আইটেম row_weightসেট করা থাকে 0

আকর্ষণীয়ভাবে যথেষ্ট, ম্যাজেন্টোর কোনও ডিফল্ট শিপিং ক্যারিয়ার আসলেই নির্ভর করে না row_weightতবে কেন / কখন row_weightসেট করা হবে তা নির্ধারণ করার পরে আমরা তা পেয়ে যাব0

row_weightসেট করা হয়েছে কেন তা নির্ধারণ করা0

এই অংশটি খনন করা বেশ সহজ ছিল। শিপিং গণনার একটি বড় অংশ এটিকে Mage_Sales_Model_Quote_Address_Total_Shipping::collectসেট row_weightকরে সহ ঘটে 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);
        }
    }

কেন এটি ম্যাজেন্টোর ডিফল্ট ক্যারিয়ারগুলিকে প্রভাবিত করে না

আপনার জন্য একটি Regex অনুসন্ধান করেন তাহলে /row_?weight/i(যেমন getRowWeight, setRowWeight, setData('row_weight'), ইত্যাদি) Mage_Shipping(সাধারণ বাহকদের) এবংMage_Usa (আপনি FedEx, ইউ.পি. এস, এবং কিছু অন্যান্য বাহক), কিছুই পপ আপ। কেন? কারণ ডিফল্ট ক্যারিয়ারগুলি পৃথক আইটেমের ওজন নয়, মোট ঠিকানার ওজন ব্যবহার করে।

উদাহরণস্বরূপ, আসুন দেখুন 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());
    }

এবং অনুরোধটি কোথা থেকে প্যাকেজের ওজন পাবে? উত্তরটি হ'ল 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());

আমরা $item->getRowWeight()এখানে ব্যবহার উপেক্ষা করতে পারি কারণ requestShippingRatesপ্যারামিটার হিসাবে নির্দিষ্ট আইটেম সরবরাহ না করে বলা হয় 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();

এটি পরিচিত হওয়া উচিত, কারণ নিখরচায় শিপিং কার্যকর হলে প্রতিটি আইটেম একই স্থানে row_weightসেট করা 0থাকে। $addressWeightপ্রতিটি আইটেমের পরিমাণগুলি কীভাবে আপ হয় তা লক্ষ্য করুন $rowWeightতবে সেটি আগে row_weightসেট হয়ে গেছে0

মূলত, ঠিকানাটির ওজন সর্বদা free_shippingপ্রতিটি আইটেমের মূল্য নির্বিশেষে সমস্ত আইটেমের মোট ওজন হবে । যেহেতু ম্যাজেন্টোর ডিফল্ট ক্যারিয়ার কেবল ঠিকানা ওজনের উপর নির্ভরশীল, তাই সমস্যাটি প্রদর্শিত row_weightহবে না।

তাহলে আমাদের কেন দরকার? row_weight

আমাদের দরকার row_weight কারণ আমরা একই গন্তব্যে (এমনকি একই ঠিকানাটির অংশ হিসাবে) চলে গেলেও বিভিন্ন উত্স থেকে আগত আইটেমগুলির জন্য পৃথক হার গণনা করার জন্য আমরা ম্যাগেন্টোর ফেডেক্স ক্যারিয়ারকে কাস্টমাইজ করেছি। উদাহরণস্বরূপ, আপনি যদি এনজে থাকেন তবে সিএ থেকে এনজে থেকে কোনও জিনিস বহন করা সস্তা (এবং দ্রুত) - এবং যদি আপনার ক্রমে এনজে এবং সিএ উভয় থেকে আইটেম থাকে তবে আপনি ব্যয়টি দেখতে পারবেন (এবং আনুমানিক অনুমান) প্রতিটি চালানের ডেলিভারি তারিখ)।

সব মিলিয়ে দেখে মনে হচ্ছে আমরা সরাসরি উপেক্ষা করে row_weightএবং ব্যবহার করে সহজেই এই সমস্যাটি ঘিরে কাজ করতে পারি weight * qty। তবে, এটি আমাদের দিকে নিয়ে যায়:

প্রশ্নটি

নিখরচায় শিপিং কার্যকর হলে Shippingমোট কেন row_weightবিক্রয় মূল্য আইটেম সেট করে 0? এটি কোথাও ব্যবহার করা হবে বলে মনে হয় না।

আরও পর্যবেক্ষণ

আমি উল্লেখ করতে অবহেলা করেছি যে row_weightএটি আসলে শূন্য-শূন্য হতে পারে, তবে তার চেয়ে কম weight * qty, যদি এর free_shippingপরিবর্তে একটি সংখ্যা হয় true। আমি ধরে নিই এর উদ্দেশ্য হল এর মতো দৃশ্যের সমাধান দেওয়া:

আমার কার্টে একই পণ্যটির 3 টি আইটেম রয়েছে, প্রতিটি আইটেম 2 পাউন্ড ওজনের। আমি একটি নিখরচায় শিপিং কুপন প্রয়োগ করি, তবে এটি 2 এর পরিমাণের মধ্যে সীমাবদ্ধ, সুতরাং এটি কেবলমাত্র 2 টি আইটেমের ক্ষেত্রে প্রযোজ্য। এখন, আমি যখন শিপিংয়ের হারগুলি দেখি, আমি শিপিং রেটগুলি 6 পাউন্ডের (2 + 2 + 2) এর পরিবর্তে 2 পাউন্ডের (2 + 0 + 0) খুঁজছি।

এটি বোধগম্য মনে হয় তবে এর সাথে দুটি বড় সমস্যা রয়েছে:

  • ডিফল্ট ম্যাজেন্টো ক্যারিয়ারগুলির মধ্যে কেউই এ জাতীয় কাজ করে না (তারা ঠিকানাটি মোট ওজন ব্যবহার করে, উপরে দেখুন)।

  • এমনকি কিছু ক্যারিয়ার যদি এটির মতো কাজ করে, তার অর্থ হ'ল আমি যে কোনও শিপিং পদ্ধতি বাছাই করতে পারি (উদাহরণস্বরূপ রাতারাতি শিপিং) এবং কেবলমাত্র 1 আইটেমের ওজনের জন্য অর্থ প্রদান করতে পারি - অর্থ্যাৎ বণিককে অন্য 2 টি আইটেমের ব্যয় বহন করতে হবে । মার্চেন্টের উপর নির্ভর করে কোনওভাবে এটি নির্ধারণ করা হবে যে আমি কেবল 1 টি আইটেমের ওজনের জন্য অর্থ প্রদান করেছি এবং তারপরে আরও 2 টি আইটেমকে আরও ব্যয়বহুল কার্যকর পদ্ধতি ব্যবহার করে জাহাজে পাঠিয়েছি, কার্যকরভাবে ম্যাজেন্টো কী প্রদর্শন করে এবং কীভাবে আইটেমগুলি আসলে ছিল তার মধ্যে একটি অমিল সৃষ্টি করে বাইরে পাঠানো


হেই, নেই তো? :)
Agop

এত বেশি ভোট, এত কম আলোচনা! ম্যাজেন্টো বিকাশের জীবন এটিই।
Agop

উত্তর:


2

ভেবেছি আমি এই সময়ে ছুরিকাঘাত করব ...;)

আপনি এখানে একটি আকর্ষণীয় প্রশ্ন উত্থাপিত তাই আমি এখানে কেন মনে করি তারা এগুলি করেছে, তবে আমি এখনও যখন এই নির্দিষ্ট ঘটনাটি কার্যকর হয় তখন তা সন্ধান করার জন্য কাজ করছি।

ইউএসপিএস ক্যারিয়ার পদ্ধতিটি অতিক্রম করে দেখে মনে হচ্ছে তাদের API এ আন্তর্জাতিক অনুরোধগুলি প্রতিটি পণ্যের জন্য আইটেমযুক্ত ওজন সরবরাহ করে। এটিই কেবল ক্যারিয়ারের সন্ধানে এটি করতে পারে। নীচের পুরো পদ্ধতি এবং তার নীচে হাইলাইটেড বিভাগটি সন্ধান করুন।

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;
    }

বিশেষ বিভাগ:

$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;
        }

আমার কাছে, এটি দেখা যাচ্ছে যে ম্যাজেন্টো প্রকৃত আইটেমের ওজনের উপর ভিত্তি করে প্যাকেজ ওজনের পুনঃ গণনা করছে, এবং ঠিকানার ওজনকে উত্তোলন করছে না। আমি অবাক হয়েছি যে প্যাকেজ আইটেমগুলি পাস করার ফলে তাদের ওজন শূন্য না হয়, কারণ এটি হারের প্রতিক্রিয়া বিবেচনা করে ভুয়া আইটেমের ওজনকে খারাপ ওজনের ডেটার ভিত্তিতে তৈরি করবে।

যদিও অন্ধকারে গুলি করা হয়েছে।


1

আমি এটিতে একটি ছুরিকাঘাতও করেছি এবং আমি কোডের এই লাইনটিতে আকর্ষণীয় কিছু পেয়েছি

$item->setRowWeight($rowWeight);

1.1.5 সংস্করণে চালু হয়েছিল এর আগে এই ফাংশনটি ছিল।

ম্যাজেন্টো মিরর আমদানি ম্যাজেন্টো মুক্তি 1.1.5 - শিপিং.এফপি

ম্যাজেন্টো মিরর আমদানি ম্যাজেন্টো মুক্তি 1.1.1 - শিপিং.এফপি

            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;
        }
    }

আমার বোধগম্যতা হল ম্যাজ_সেলস_মোডেল_কোট_এড্রেস_টোটাল_শপিং :: সংগ্রহ / আপডেট $ অ্যাড্রেসওয়েট এবং $ ফ্রিমথডওয়েট গণনা করা দরকার

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

এবং $ আইটেম-> সেটআরওয়েট রডটি এখানে ব্যবহার করা উচিত নয় কারণ এই আইটেমের সাথে উক্তি এবং ঠিকানার সাথে সম্পর্কিত।

আমার বাজি এই যে এটি একটি ভুল। সম্ভবত সারি_টোটাল কখনই শিপিং পদ্ধতিতে ব্যবহারের উদ্দেশ্যে করা হয়নি তাই ডিফল্ট মডিউলগুলি এটি ব্যবহার করছে না।

আমি কোনও পরিবর্তন লগ খুঁজে বের করতে সক্ষম হইনি যা ব্যাখ্যা করতে পারে যে এটি ভি 1.1.5-এ কেন চালু হয়েছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.