ট্যাক্স গণনা করার সময় কেন ম্যাজেন্টো একটি গোলাকার ডেল্টা সঞ্চয় করে


14

মডেলটিতে tax/Sales_Total_Quote_Taxএমন একটি পদ্ধতি রয়েছে _deltaRound()যা দামকে চারদিকে ফেলে। এটি 0.5 ডিগ্রি করে যখন অবিচ্ছিন্ন আচরণ বন্ধ করতে একটি ছোট ব-দ্বীপ যুক্ত করে।

/**
 * Round price based on previous rounding operation delta
 *
 * @param float $price
 * @param string $rate
 * @param bool $direction price including or excluding tax
 * @param string $type
 * @return float
 */
protected function _deltaRound($price, $rate, $direction, $type = 'regular')
{
    if ($price) {
        $rate = (string)$rate;
        $type = $type . $direction;
        // initialize the delta to a small number to avoid non-deterministic behavior with rounding of 0.5
        $delta = isset($this->_roundingDeltas[$type][$rate]) ? $this->_roundingDeltas[$type][$rate] : 0.000001;
        $price += $delta;
        $this->_roundingDeltas[$type][$rate] = $price - $this->_calculator->round($price);
        $price = $this->_calculator->round($price);
    }
    return $price;
}

তবে এটি একটি ব-দ্বীপ সঞ্চয় করে। যদি এটি কোনও সঞ্চিত ডেল্টাটি না খুঁজে পায় তবে এটি একটি তৈরি করে। কেন? আমি যতটুকু ট্যার বলতে পারি, এটি অভিন্ন ক্রিয়াকলাপগুলির সাথে বিভিন্ন ফলাফলের দিকে নিয়ে যায়।

ধরা যাক আমাদের $price3.595 এর একটি আছে এবং আমাদের কোনও ক্যাশে নেই $delta। আমরা পদ্ধতিটি অনুসরণ করার সাথে সাথে আমরা $ ডেল্টা = 0.000001 পাব। তারপরে আমরা $price= 3.595001 পেয়ে যা, যা 3.60 এর সাথে গোল হয়, সুতরাং আমাদের $delta-0.004999 এর একটি নতুন আছে । এবং আমরা ফিরে 3.60।

এখনই আমাদের কাছে একটি ব-দ্বীপ রয়েছে সুতরাং আসুন এটি আবার $price= 3.595 দিয়ে করুন। $price= 3.595 - 0.004999 = 3.590001

যা আমরা যদি গোল করি তবে আমরা 3.59 পেয়ে যাব। বিভিন্ন উত্তর।

আমার কাছে মনে হয় যে কোনও গোলাকার অ্যালগরিদম ব্যবহার করা হয়েছে কমপক্ষে প্রতিটি সময় একই যুক্তি দিয়ে চালানো উচিত, তবে এবার নয়।


উত্তর:


9

আমার সার্ভারে আমার ম্যাজেন্টো 1.8 রয়েছে এবং আমি _deltaRound()পদ্ধতিটি পরীক্ষা করেছি । এটি এখন এই মত চেহারা।

/**
 * Round price based on previous rounding operation delta
 *
 * @param float $price
 * @param string $rate
 * @param bool $direction price including or excluding tax
 * @param string $type
 * @return float
 */
protected function _deltaRound($price, $rate, $direction, $type = 'regular')
{
    if ($price) {
        $rate  = (string) $rate;
        $type  = $type . $direction;
        $delta = isset($this->_roundingDeltas[$type][$rate]) ? $this->_roundingDeltas[$type][$rate] : 0;
        $price += $delta;
        $this->_roundingDeltas[$type][$rate] = $price - $this->_calculator->round($price);
        $price = $this->_calculator->round($price);
    }
    return $price;
}

আপনি দেখতে পাচ্ছেন যে, _roundingDeltas()সেট না করা থাকলে এটি zeroএর ডিফল্ট মান হিসাবে নেয় । এটি কেবল আপনাকে লক্ষ্য করার জন্য। ম্যাজেন্টো টিম আপনার সন্দেহ শুনতে পারে। তারা আপনার সমস্যার নীরবে সমাধান করেছে। :)

সম্পাদনা

আসুন আসল সময়ের উদাহরণে প্রয়োগ করে এই ফাংশনটির ব্যবহার বিশ্লেষণ করা যাক। ধরুন আমার কার্টে একটি পণ্য রয়েছে যা করযোগ্য। ৫ যে পরিমাণ আমি ক্রয় করতে যাচ্ছি তা হ'ল, ৫. কর প্রয়োগের পরে, প্রডাক্টটির দাম রয়েছে .5 10.5356। সুতরাং এটি আমার অবস্থা

CART
-------
   Product A
       - Price (including tax) - 10.5356
       - Quantity              - 5
       - Tax Rule  - Apply tax for each product. Then calculate the total price according to the quantity purchased.

সুতরাং এখন আসুন আমরা এই পরিস্থিতিতে উত্পাদন করতে যাচ্ছে যে আসল দাম গণনা করা যাক। এটা হবে

  Total =  10.5356 x 5 = 52.678

এখন ধরা যাক, ম্যাজেন্টো _deltaRound()পদ্ধতি ব্যবহার করে না । এটি কেবলমাত্র দামের দশমিক স্থানে গোল করে এবং তারপরে মোট দাম গণনা করে। এক্ষেত্রে পণ্যের দাম গোল হয়ে যাবে 10.54এবং সুতরাং মোট দাম হবে

  Total = 10.54 x 5 = 52.7

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

  Total =  10.54+10.53+10.54+10.53+10.54 = 52.68

তার অর্থ _deltaRound()পদ্ধতিটি প্রকৃত করের মূল্য নির্ধারণের সাথে করের মূল্যকে আরও গোল করে তোলে। যেমন আপনি বলেছেন যে এই পদ্ধতিটি বিভিন্ন গোলাকার মানটি ব-দ্বীপের মানের উপর নির্ভর করে। এই ডেল্টা মানটি করকে আরও বেশি সঠিক করে তোলে।

এটি অনুসারে, আমরা উপসংহারে পৌঁছাতে পারি যে পরিমাণের পরিমাণ বৃদ্ধি পাওয়ার সাথে সাথে আমরা যদি এই পদ্ধতিটি গ্রহণ না করি তবে এটি বৃত্তাকার মান এবং প্রকৃত মানের মধ্যে একটি বৃহত পার্থক্য তৈরি করবে। তবে আমরা যদি এই পদ্ধতিটি ব্যবহার করি তবে এটি আমাদের বৃত্তাকার মানটিকে আসল মানের সাথে যতটা সম্ভব সম্ভব করে তুলবে।

দুটি দশমিক জায়গায় ডিফল্ট রাউন্ডে ম্যাজেন্টো। এই পদ্ধতিটিই দুটি দশমিক স্থানের জন্য দায়বদ্ধ

Location :app/code/core/Mage/Core/Model/Store.php
public function roundPrice($price)
{
    return round($price, 2);
}

যদি আমরা এটিকে 4 বা কিছুতে সেট করে রাখি তবে আমরা আরও বেশি করে বৃত্তাকার যথার্থতা বাড়াতে পারি।

দ্রষ্টব্য: এটি আমার প্রকাশনা এবং ওভারভিউ। এটি সত্য বা নাও হতে পারে। তবে এটি আমার কাছে সঠিক এবং যৌক্তিক বলে মনে হচ্ছে।

ধন্যবাদ।


আমি সত্যিই হার্ড কোডড 2 ইনroundPrice
ডেভিড ম্যানার্স

@ ডেভিড ম্যানার্স: হ্যাঁ এটি সঠিক। তবে ম্যাজেন্টো কিছুটা বাড়াতে _deltaRound()অসুবিধা কাটিয়ে উঠতে ব্যবহার করে। যেভাবেই এর হার্ড কোডড। এটি অবশ্যই কিছু ক্ষেত্রে কিছু অসুবিধা বাড়িয়ে তুলবে
রাজীব কে টমি

1
এ খুঁজছি github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/... Magento 1.9, যা আমাদেরকে শিপিং ট্যাক্স calcualtions ith একটি rouning ত্রুটি দেখা দেয় জন্য এখনও 0.0001 ডিফল্ট মান হয়
ProxiBlue

2

তথ্য

পূর্ববর্তী রাউন্ডিং অপারেশন ডেল্টার ভিত্তিতে ম্যাজেন্টোতে রাউন্ড মূল্য price

অ্যাপ / কোড / কোর / মাইজ / ট্যাক্স / মডেল / বিক্রয় / মোট / উদ্ধৃতি / কর.এফপি: 1392 অ্যাপ্লিকেশন / কোড / কোর / Mage / ট্যাক্স / মডেল / বিক্রয় / মোট / উদ্ধৃতি / সাবটোটাল.এফপি: 719

protected function _deltaRound($price, $rate, $direction, $type = 'regular')
{
    if ($price) {
        $rate = (string)$rate;
        $type = $type . $direction;
        // initialize the delta to a small number to avoid non-deterministic behavior with rounding of 0.5
        $delta = isset($this->_roundingDeltas[$type][$rate]) ? $this->_roundingDeltas[$type][$rate] : 0.000001;
        $price += $delta;
        $this->_roundingDeltas[$type][$rate] = $price - $this->_calculator->round($price);
        $price = $this->_calculator->round($price);
    }
    return $price;
}

কখনও কখনও এটি উচ্চ ব-দ্বীপ গণনা ত্রুটির কারণে ত্রুটি সৃষ্টি করতে পারে ( $this->_calculator->round($price))। উদাহরণস্বরূপ, এই কারণে কিছু দাম ± 1 সেন্টের মধ্যে পরিবর্তিত হতে পারে ।

সমাধান

এটি এড়াতে আপনার ব-দ্বীপ গণনার যথাযথতা উন্নত করতে হবে।

পরিবর্তন

$this->_roundingDeltas[$type][$rate] = $price - $this->_calculator->round($price);

প্রতি

$this->_roundingDeltas[$type][$rate] = $price - round($price, 4);

উভয় ফাইলে পরিবর্তন করা দরকার:

অ্যাপ / কোড / কোর / মাইজ / ট্যাক্স / মডেল / বিক্রয় / মোট / উদ্ধৃতি / কর.এফপি: 1392 অ্যাপ্লিকেশন / কোড / কোর / Mage / ট্যাক্স / মডেল / বিক্রয় / মোট / উদ্ধৃতি / সাবটোটাল.এফপি: 719

কোর ফাইলগুলি সংশোধন বা হ্যাক করবেন না! পুনর্লিখন করুন!

সমাধানটি Magento 1.9.x এর বিভিন্ন সংস্করণে পরীক্ষা করা হয়েছিল, তবে সম্ভবত এটি পূর্ববর্তী সংস্করণগুলিতে কাজ করবে।

পুনশ্চ

roundPriceনীচে প্রদর্শিত হিসাবে ফাংশন পরিবর্তন করুন, রাউন্ডিং ত্রুটির সমস্যাটি সমাধান করতে পারে তবে এটি অন্যকে ঘটাতে পারে (উদাহরণস্বরূপ, কিছু প্ল্যাটফর্মগুলি 2 দশমিক স্থানে গোল করে প্রয়োজন)।

অ্যাপ্লিকেশন / কোড / কোর / পুরোনো যাদুকর / কোর / মডেল / Store.php: 995

public function roundPrice($price)
{
    return round($price, 4);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.