কুপন লজিকের ফাঁদ: এমন স্ট্যাকিং নিয়ম যা কার্ট ভেঙে দেয় না
কুপন লজিকের সমস্যা চেকআউট টোটাল ভাঙিয়ে দিতে পারে। দ্বিগুণ ছাড়, বাদ দেয়া আইটেম ও নেগেটিভ টোটাল প্রতিরোধ করার জন্য স্ট্যাকিং নিয়ম, এক্সক্লুউশন এবং টেস্টযোগ্য প্যাটার্ন শিখুন।
কেন প্রোমো লজিক এতটাই ভাঙে\n\nপ্রোমো দেখতে সহজ লাগে যতক্ষণ না আপনি সেটা বাস্তব চেকআউটে বসান। একটি কার্ট সবসময় পরিবর্তনশীল, কিন্তু ডিসকাউন্ট প্রায়ই একবারের নিয়ম হিসেবে লেখা হয়। এ খালি জাগা থেকেই কুপন লজিকের অধিকাংশ সমস্যা আসে।\n\nকঠিন অংশটি হলো একটি নতুন নিয়মই সব জায়গায় টোটাল বদলে দিতে পারে। ধরুন আপনি যোগ করলেন “10% ছাড়, কিন্তু সেলে থাকা পণ্যের ওপর নয়” — তখন আপনাকে বোঝাতে হবে “সেল” বলতে কি বুঝাচ্ছে, কখন সেটা পরীক্ষা করা হবে, এবং 10% কে কোন মূল্য থেকে কাটা হবে। যদি আরেকটি প্রোমো একই আইটেমে প্রভাব করে, তাহলে প্রাধান্য বা ক্রম গণনার ফল বদলে যায়।\n\nঅনেক টীমই ব্যবসায়িক নিয়মের সঙ্গে গণিতে মিশিয়ে দেয়। “ছাড় সাবটোটালে সীমাবদ্ধ কর”–এর মতো দ্রুত ফিক্স তিন জায়গায় কপি হয়ে যায়, এবং শীঘ্রই আপনি দেখতে পাবেন আলাদা ফলাফল নির্ভর করছে কোথায় মোট হিসাব করা হয়েছে (কার্ট পাতা, চেকআউট, ইনভয়েস, ইমেইল)।\n\nসিস্টেম যখন দামগুলো পুনরায় গণনা করে, তখন ঝুঁকি বেশি থাকে:\n\n- কার্ট আপডেট: পরিমান পরিবর্তন, আইটেম সরানো, শিপিং পদ্ধতি বদলানো\n- পেমেন্টের পরে সম্পাদনা: ঠিকানা পরিবর্তন, আংশিক বাতিল, আইটেম বদলী\n- রিফান্ড ও রিটার্ন: আইটেমগুলোর মধ্যে প্রোরেটিং, ট্যাক্স সমন্বয়, স্টোর ক্রেডিট\n- বহুমুদ্রা বা ট্যাক্স মোড পরিবর্তন: নেট বনাম গ্রস মূল্য, ট্যাক্স-ইনক্লুসিভ মোট\n\nএকটি ছোট উদাহরণ: একজন কেনাকাটাকারী একটি বাণ্ডিল দেয়া আইটেম তার কার্টে রেখে “$100 এ $20 ছাড়” কোড দেয়, তারপর একটি আইটেম সরিয়ে দেয়। যদি আপনার কোড পুরনো সাবটোটাল "মনে রাখে", তাহলে $85-এও $20 ছাড় হয়ে যেতে পারে, এমনকি কোনো লাইন আইটেম নেতিবাচকও হয়ে পড়তে পারে।\n\nএই পোস্টের শেষে আপনি সাধারণত যে প্রোমো সমস্যাগুলো ঘটতে পারে তা প্রতিরোধ করতে পারবেন: দ্বিগুণ ছাড়, স্ক্রিনগুলোর মধ্যে মিল না থাকা টোটাল, নেতিবাচক টোটাল, বাদ দেয়া আইটেমে ছাড় প্রয়োগ এবং এমন রিফান্ড যা গ্রাহক প্রথমে যা দিয়েছিল তার সাথে মেলে না।\n\n## পরিষ্কার স্ট্যাকিং ও প্রায়োরিটি নিয়ম দিয়ে শুরু করুন\n\nঅধিকাংশ কুপন লজিক সমস্যা শুরু হয় এক বাক্য অনুপস্থিত থাকায়: কোন ডিসকাউন্টগুলো একসঙ্গে প্রয়োগ করা যাবে, এবং কী ক্রমে। যদি আপনি স্ট্যাকিং নিয়ম সহজ ভাষায় ব্যাখ্যা করতে না পারেন, আপনার কার্ট শেষ পর্যন্ত কোনো আশ্চর্য ফল দেবে।\n\nস্ট্যাকিংকে হ্যাঁ/না দিয়ে সংজ্ঞায়িত করুন। উদাহরণ: “প্রতি অর্ডারে একটি ম্যানুয়াল কুপন। কুপন যদি না বলে তবে স্বয়ংক্রিয় প্রোমো প্রযোজ্য থাকতে পারে।” এই এক লাইনটি র্যান্ডম কম্বিনেশনগুলোকে বাধা দেয় যা দ্বিগুণ ছাড়ের দিকে নিয়ে যায়।\n\nপ্রাথমিকভাবে আইটেম-সতর্ক ডিসকাউন্টগুলোকে অর্ডার-স্তরের ডিসকাউন্ট থেকে আলাদা করুন। আইটেম-স্তরের নিয়ম নির্দিষ্ট পণ্যের মূল্য বদলে দেয় (যেমন জুতায় 20% ছাড়)। অর্ডার-স্তরের নিয়ম মোটকে পরিবর্তন করে (যেমন কার্টে $10 ছাড়)। বিন্যস্ত না করে মিশালে পেজ, কার্ট এবং চেকআউটের মধ্যে টোটাল ভ্রান্ত হতে শুরু করে।\n\nকোড লেখার আগে “সেরা ডিল” কি তা সিদ্ধান্ত নিন। অনেক টীম “সর্বাধিক সঞ্চয়” বেছে নেয়, কিন্তু সেটা মূল্য নীচে ভেঙে দিতে পারে। আপনার দরকার হতে পারে “মূল্যের নীচে কখনো ডিসকাউন্ট নয়” বা “শিপিং কখনো নেতিবাচক হতে পারবে না”–এর মতো নিয়ম। এক পরিষ্কার বিজয়ী নিয়ম বেছে নিন যাতে ইঞ্জিন অনুমান না করে।\n\nএকটি সরল প্রায়োরিটি তালিকা দ্বন্দ্বগুলোকে পূর্বানুমেয় রাখে:\n\n- স্বয়ংক্রিয় প্রোমো প্রথম (ক্যাটালগ বা মৌসুমি নিয়ম)\n- ম্যানুয়াল কুপন পরবর্তীতে (গ্রাহক যেটা টাইপ করেছে)\n- স্টোর ক্রেডিট বা গিফটকার্ড সর্বশেষ (টেন্ডার, ডিসকাউন্ট নয়)\n- ট্যাক্স ও শিপিং ডিসক্যালকুলেট করা হয় ডিসকাউন্টগুলোর পরে\n\nউদাহরণ: একটি কার্টে সব আইটেমে 10% স্বয়ংক্রিয় প্রোমো আছে, আর গ্রাহক $100 পেরোলেই $15 ছাড়ের কুপন দিয়েছে। যদি আপনার প্রায়োরিটি বলে স্বয়ংক্রিয় প্রথম, আপনি পরিষ্কারভাবে বলতে পারবেন: $100 থ্রেশহোল্ডটি প্রি-ডিসকাউন্ট সাবটোটাল ব্যবহার করেছে নাকি ডিসকাউন্ট করা সাবটোটাল? সেটা লিখে রাখুন এবং সব জায়গায় সঙ্গত রাখুন।\n\nএকবার এই পছন্দগুলো লিখে রাখলে আপনার কুপন স্ট্যাকিং নিয়মগুলো টেস্টযোগ্য নিয়ম হয়ে যায়, লুকানো আচরণ নয়। এটি পরবর্তীতে কুপন লজিক সমস্যা এড়ানোর দ্রুততম উপায়।\n\n## ডিসকাউন্টকে সরল, স্পষ্ট ডেটা হিসেবে মডেল করুন\n\nঅনেক কুপন সমস্যা শুরু হয় যখন ডিসকাউন্টগুলো চেকআউট কোড জুড়ে ছড়িয়ে থাকে। নিরাপদ পদ্ধতি হল প্রতিটি প্রোমোকে টাইপ, স্কোপ এবং সীমা সহ ডেটা হিসেবে দেখা। তখন আপনার কার্ট ম্যাথ ছোট, পূর্বানুমেয় এক মূল্যায়ক হয়ে ওঠে।\n\nপ্রোমোকে মার্কেটিং ধারণার নামে না করে সেইটির ধরণ নাম দিয়ে শুরু করুন। বেশিরভাগ প্রোমো কয়েকজন আকৃতির মধ্যে পড়ে: শতাংশে ছাড়, নির্দিষ্ট পরিমাণ ছাড়, ফ্রি আইটেম (বা বায় এক পেয়ে ওয়ান), এবং ফ্রি শিপিং। আপনি যখন এগুলোতে প্রকাশ করতে পারেন, আপনি কঠিন স্পেশাল কেসগুলো এড়াবেন যা টেস্ট করা কঠিন।\n\nপরবর্তী পদক্ষেপে স্কোপ স্পষ্ট করুন। একই শতাংশ-ছাড় আলাদাভাবে আচরণ করে নির্ভর করে কী লক্ষ্য করা হচ্ছে। সংজ্ঞায়িত করুন এটি কি পুরো অর্ডার, কোন ক্যাটাগরি, কোনো প্রোডাক্ট, একক লাইন আইটেম, না কি শিপিং-এ প্রযোজ্য। স্কোপ অস্পষ্ট হলে আপনি ভুল সাবটোটালে ডিসকাউন্ট দেবেন বা দ্বিগুণ ডিসকাউন্ট ঘটাতে পারেন।\n\nকনস্ট্রেইন্টগুলো কোড মন্তব্য নয়, ফিল্ড হিসেবে ধরুন। সাধারণগুলো: মিনিমাম স্পেন্ড, প্রথম অর্ডারের জন্যই, এবং তারিখ সীমা। এছাড়া লিখে রাখুন সেল প্রাইসের সাথে কিভাবে আচরণ করবে: ওপরে স্ট্যাক হবে, মূল মূল্যের উপর প্রয়োগ হবে, না কি সেল আইটেমগুলো বাদ থাকবে।\n\nএকটি সংক্ষিপ্ত রুল স্কিমা থাকতে পারে:\n\n- type (percent, fixed, free_item, free_shipping)\n- scope (order, category, product, item, shipping)\n- constraints (min_spend, first_order, start_at, end_at)\n- floors (min_total = 0, min_item_price, optional min_margin)\n- rounding policy (per item vs per order)\n\nঅবশেষে, এমন মূল্য নীচের সীমা যোগ করুন যা ইঞ্জিন সবসময় রক্ষা করবে: টোটাল কখনো শূন্যের নিচে যাবে না, এবং আপনার ব্যবসায় যদি দরকার হয়, আইটেম কখনো খরচের নিচে যাবে না (বা কোনো নির্দিষ্ট ন্যূনতম মূল্যের নিচে)। এটি বিল্ড করলে আপনি নেতিবাচক টোটাল এবং অদ্ভুত "আমরা গ্রাহককে টাকা দিচ্ছি" পরিস্থিতি প্রতিরোধ করবেন।\n\nআপনি যদি একটি ডিসকাউন্ট ইঞ্জিন Koder.ai-তে প্রোটোটাইপ করেন, পরিকল্পনা মোডে এই ফিল্ডগুলো দৃশ্যমান রাখুন যাতে ইভ্যালুয়েটর সহজ এবং টেস্টযোগ্য থাকে যতটা প্রোমো বাড়ে।\n\n## ধাপে ধাপে: প্রোমো মূল্যায়নের নিরাপদ উপায়\n\nঅধিকাংশ সমস্যা তখনই শুরু হয় যখন যোগ্যতা চেক ও গণিত মিশে যায়। দুই-ধাপ প্যাটার্ন নিরাপদ: প্রথমে ঠিক করুন কী প্রয়োগ করা যাবে, তারপর পরিমাণগুলো গণনা করুন। এই আলাদা রাখা নিয়মগুলোকে পড়তে সহজ করে এবং ভুল অবস্থা (যেমন নেতিবাচক টোটাল) প্রতিহত করা সহজ করে।\n\n### একটি নির্ধারিত (deterministic) মূল্যায়ন ক্রম\n\nপ্রতি বার একই ক্রম ব্যবহার করুন, এমনকি যদি UI বা API থেকে প্রোমো আলাদা ক্রমে আসুক। নির্ধারণযোগ্যতা গুরুত্বপূর্ণ কারণ এটি "এই কার্ট কেন বদলেছে?"—এর মতো প্রশ্নের উত্তর দেয়ার যোগ্য করে তোলে।\n\nএকটি সহজ ফ্লো যা ভালো কাজ করে:\n\n- ইনপুট: প্রোমো কোড ফর্ম্যাট, তারিখ উইন্ডো, গ্রাহক স্কোপ, কারেন্সি, এবং মূল্য অসম্মান নন-নেগেটিভ আছে কি না।\n- : যোগ্যতা চালান শুধু (এখনো টাকা নয়)। প্রার্থী তালিকা তৈরি করুন।\n- : আপনার স্ট্যাকিং নিয়ম প্রয়োগ করুন (উদাহরণ: "একটি অর্ডার-স্তরের প্রোমো সর্বোচ্চ") এবং টাই-ব্রেকার (প্রায়োরিটি, তারপর সর্বোত্তম মান, তারপর স্থিতিশীল ID)।\n- : একটি সঙ্গত বেস ব্যবহার করে ডিসকাউন্টগুলি গণনা করুন (প্রি-ট্যাক্স বনাম পোস্ট-ট্যাক্স, শিপিং অন্তর্ভুক্ত কি না) এবং রাউন্ডিং নিয়ম।\n- : লাইন টোটাল থেকে অর্ডার টোটাল পুনর্গণনা করুন, তারপর জিরোতে ক্যাপ করুন এবং সর্বোচ্চ ডিসকাউন্ট সীমা প্রয়োগ করুন।\n\n### ব্রেকডাউন এবং অডিট ট্রেইল ট্র্যাক করুন\n\nপ্রোমো প্রয়োগ করার সময় কেবল একটি "ডিসকাউন্ট টোটাল" সংরক্ষণ করবেন না। লাইন আইটেম এবং অর্ডার উভয়ের জন্য একটি ব্রেকডাউন রাখুন যাতে আপনি টোটাল মিলাতে এবং ব্যাখ্যা করতে পারেন।\n\nকমপক্ষে রেকর্ড করুন:\n\n- কোন নিয়ম বা প্রোমো প্রয়োগ করেছে (ID এবং সংস্করণ), এবং তার প্রায়োরিটি\n- কেন এটি প্রয়োগ হলো (যোগ্যতার তথ্য যেমন "category=shoes", "cart subtotal >= 50")\n- এটি কী পরিবর্তন করেছে (প্রভাবিত লাইন ID, বেস অ্যামাউন্ট, ডিসকাউন্ট অ্যামাউন্ট, রাউন্ডিং)\n- এটি কী রোধ করেছে (উদাহরণ: "blocked by exclusion: already has item-level discount")\n\nউদাহরণ: একটি কার্টে দুইটি আইটেম আছে, একটির দাম ইতিমধ্যেই সেলে আছে। ফেজ 1 কোডটিকে পুরো মূল্যের আইটেমটির জন্য যোগ্য চিহ্নিত করে। ফেজ 2 ঐ লাইনে 10% প্রয়োগ করে, সেল লাইনে কিছু করে না, তারপর লাইন ব্রেকডাউন থেকে অর্ডার টোটাল পুনর্গণনা করে যাতে আপনি অনিচ্ছাকৃত দ্বিগুণ-ডিসকাউন্ট এড়াতে পারেন।\n\n## স্প্যাগেটি লজিক না তৈরি করে এক্সক্লুউশন এনকোড করুন\n\nঅধিকাংশ কুপন লজিক সমস্যা তখনই শুরু হয় যখন এক্সক্লুউশনগুলো বিশেষ-কেস ব্রাঞ্চে লুকানো থাকে, যেমন "যদি কোড X হয় তাহলে Y স্কিপ কর"। এটা এক প্রোমোর জন্য কাজ করে, তারপর পরের প্রোমো এলে ভেঙে পড়ে।\n\nনিরাপদ প্যাটার্ন হল: একটি একক মূল্যায়ন ফ্লো রাখুন, এবং এক্সক্লুউশনকে এমন চেকগুলোর সেট হিসেবে রাখুন যা কোনো প্রোমো কম্বিনেশনকে গণনায় ফিরত দিতে পারে, তার ফলে ডিসকাউন্ট কখনো আংশিকভাবে প্রয়োগ হবে না।\n\n### এক্সক্লুউশনকে ডেটা হিসেবে আচরণ করুন, না যে ব্রাঞ্চিং\n\nহার্ডকোড আচরণ করার পরিবর্তে প্রতি প্রোমোকে একটি ছোট, স্পষ্ট "কমপাটিবিলিটি প্রোফাইল" দিন। উদাহরণ: প্রোমো টাইপ (কুপন বনাম স্বয়ংক্রিয় সেল), স্কোপ (আইটেম, শিপিং, অর্ডার), এবং কombination নিয়ম।\n\nসমর্থন করুন দুটোই:\n\n- "Cannot combine with" তালিকা (denylist): প্রোমো A প্রোমো B ব্লক করে।\n- "Only combine with" তালিকা (allowlist): প্রোমো A নির্দিষ্ট নামকৃত সেটের সঙ্গে মাত্র স্ট্যাক করতে পারে।\n- রুল ফ্ল্যাগ যেমন "blocks automatic sales" বা "requires no other coupons."\n\nমূল কথা হলো আপনার ইঞ্জিন প্রতিটি প্রোমোর জন্য একই প্রশ্ন জিজ্ঞেস করবে, তারপর সিদ্ধান্ত নেবে সেটটি বৈধ কি না।\n\n### সংঘাতগুলো স্পষ্ট করুন, অটো সেল সহ\n\nস্বয়ংক্রিয় সেল প্রায়ই প্রথমে প্রয়োগ হয়, তারপর কুপন আসে এবং তা মৃদুভাবে ওভাররাইড করে। আগে থেকেই সিদ্ধান্ত নিন কি হওয়া উচিত:\n\n- কুপন সেলের উপর স্ট্যাক করবে\n- কুপন কেবল নন-সেল আইটেমে প্রযোজ্য হবে\n- সেল উপস্থিত থাকলে কুপন প্রত্যাখ্যান করা হবে\n\nপ্রতিটি প্রোমোর জন্য একটি বিকল্প গণনা পথ নয়, বরং একটি চেক হিসেবে একটিকে এনকোড করুন।\n\nআচরণ অপ্রত্যাশিত না করতে একটি ব্যবহারিক উপায় হল সিমেট্রি ভ্যালিডেট করা। যদি “WELCOME10 cannot combine with FREESHIP” উভয় দিকেই বাধা দেয়ার মত উদ্দেশ্য থাকে, তাহলে এটিকে দুপক্ষীয়ভাবে এনকোড করুন। যদি তা উভয়দিক না হয়, তা ইচ্ছাকৃত এবং ডেটায় দৃশ্যমান রাখুন।\n\nউদাহরণ: একটি সাইটওয়াইড 15% স্বয়ংক্রিয় সেল চলছে। গ্রাহক 20% কুপন দেয় যা কেবল পূর্ণ-মূল্যের আইটেমের জন্য। আপনার চেকগুলো কুপনটি সেল আইটেম বাদ দিয়ে যোগ্যতা যাচাই করবে এবং তারপর টোটাল গণনা করবে, বদলে পরে সামঞ্জস্য করার চেষ্টা করবে না।\n\nযদি আপনি Koder.ai-র মতো প্ল্যাটফর্মে আপনার ডিসকাউন্ট রুল তৈরি করেন, এই চেকগুলো আলাদা, টেস্টযোগ্য স্তর হিসেবে রাখুন যাতে আপনি গণিত পুনরায় লেখার দরকার ছাড়াই নিয়ম বদলাতে পারেন।\n\n## এজ কেসগুলো যা মিল না থাকা টোটাল সৃষ্টি করে\n\nঅধিকাংশ কুপন দ্বন্দ্ব হেডলাইন ডিসকাউন্ট নিয়ে নয়। এগুলো ঘটে যখন একই কার্ট দুইটি সামান্যভাবে ভিন্ন পথে গণনা করা হয়, তখন গ্রাহক কার্টে একটি সংখ্যা দেখে আর চেকআউটে অন্য।\n\nশুরু করুন আপনার অপারেশন অর্ডার লক করে। সিদ্ধান্ত নিন এবং ডকুমেন্ট করুন আইটেম-স্তরের ডিসকাউন্ট অর্ডার-স্তরের ডিসকাউন্টের আগে হবে কি না, এবং শিপিং কোথায় ফিট করে। একটি প্রচলিত নিয়ম: প্রথম আইটেম ডিসকাউন্ট, তারপর বাকি সাবটোটালে অর্ডার-ডিসকাউন্ট, তারপর শিপিং ডিসকাউন্ট শেষ। যাই বেছে নিন, প্রতিটি স্থানে একই সিকোয়েন্স ব্যবহার করুন।\n\nট্যাক্স পরবর্তীতে বড় ফাঁদ। যদি আপনার দাম ট্যাক্স-ইনক্লুসিভ হয়, তাহলে ডিসকাউন্ট ট্যাক্স অংশও কমায়। যদি দাম ট্যাক্স-এক্সক্লুসিভ হয়, ট্যাক্স ডিসকাউন্টের পরে গণনা করা হয়। ভিন্ন অংশে এই মডেলগুলো মিশালে ক্লাসিক সমস্যা হয় কারণ দুইটি সঠিক গণনা ভিন্ন ট্যাক্স বেস ধরে নিয়ে ভিন্ন ফল দেয়।\n\nরাউন্ডিং ছোট দেখালেও বড় সাপোর্ট টিকিট তৈরি করে। সিদ্ধান্ত নিন আপনি per-line রাউন্ড করবেন না কি per-order, এবং আপনার কড়েন্সি প্রিসিশন মেনে চলুন। শতাংশ কুপনে, লাইন রাউন্ডিং অনেক কম দামের আইটেম দিয়ে মিল থেকে কয়েক সেন্ট বিচ্যুতি করতে পারে।\n\nএখানে এমন এজ কেসগুলো যা স্পষ্টভাবে হ্যান্ডল করা দরকার:\n\n- রিটার্ন ও আংশিক রিফান্ড: ডিসকাউন্টগুলো আইটেমগুলোর মধ্যে প্রোরেট করুন যাতে রিফান্ড প্রদেয় পরিমাণের বেশি না হয়।\n- কার্টে পরিবর্তন কুপন প্রয়োগের পরে: আইটেম যোগ/সরালে যোগ্যতা ও ক্যাপ পুনর্মূল্যায়ন করুন।\n- শিপিং পরিবর্তন: ঠিকানা বা পদ্ধতি বদলে ট্যাক্সযোগ্য পরিমাণ ও শিপিং ডিসকাউন্ট প্রভাবিত হতে পারে।\n- পরিমাণ পরিবর্তন: একই আইটেমের পরিমাণ বাড়লে থ্রেশহোল্ড পার হতে পারে (উদাহরণ: min spend বা buy-X-get-Y)।\n- মিশ্র ট্যাক্সযোগ্য আইটেম: কিছু আইটেম ট্যাক্স-ননট্যাক্সেবল হতে পারে কিন্তু কুপনের জন্য যোগ্য থাকতে পারে।\n\nএকটি কংক্রিট উদাহরণ: 10% অর্ডার কুপন এবং $50-এর ওপর ফ্রি শিপিং। যদি কুপন থ্রেশহোল্ড চেকের আগে প্রয়োগ হয়, ডিসকাউন্টেড সাবটোটাল $50-এর নিচে পড়ে ফ্রি শিপিং চলে যাবে। একটি ব্যাখ্যা বেছে নিন, সেটা রুল হিসেবে এনকোড করুন, এবং কার্ট, চেকআউট, এবং রিফান্ডে একই রাখুন।\n\n## সাধারণ প্রোমো বাগ এবং সেগুলো কীভাবে ঘটে\n\nঅধিকাংশ কুপন সমস্যা তখনই দেখা দেয় যখন কার্ট একটির বেশি পথ ধরে মূল্যায়ন হয়। কোনো প্রোমো একটি স্থানে লাইন-আইটেম স্তরে প্রয়োগ হতে পারে এবং অন্য জায়গায় আবার অর্ডার স্তরে, এবং দুটোই স্বতন্ত্রভাবে "সঠিক" মনে হতে পারে।\n\nএখানে সবচেয়ে সাধারণ বাগগুলো এবং প্রতিটির পেছনের কারণগুলো:\n\n- একই আইটেমে দ্বিগুণ ডিসকাউন্ট: একই প্রোমো একটি স্থানে আইটেমের দামে প্রয়োগ হয়েছে এবং অন্য জায়গায় অর্ডার টোটালে আবার প্রয়োগ হয়েছে — প্রায়ই কারণ দুটি সার্ভিসই ডিসকাউন্ট প্রয়োগ করছে।\n- নেতিবাচক টোটাল বা নেতিবাচক লাইন আইটেম: নির্দিষ্ট পরিমাণের ডিসকাউন্ট অনুমোদিত হয়েছে যোগ্য পরিমাণ ছাড়িয়ে (উদাহরণ: $20 ছাড় $12 যোগ্য সাবটোটালে) এবং জিরো-ফ্লোর নেই।\n- শতাংশ ছাড় ইতিমধ্যেই কমানো দামের পরে প্রয়োগ হয়েছে: ইঞ্জিন 10% প্রয়োগ করেছে হালনাগাদ প্রাইসে যখন নিয়মটি ছিল "লিস্ট প্রাইসে 10%" কারণ কোড বর্তমান দাম ব্যবহার করেছে, বেস দাম নয়।\n- মিনিমাম স্পেন্ড ভুল সাবটোটালের বিরুদ্ধে চেক করা হয়েছে: নিয়মটি প্রি-ডিসকাউন্ট সাবটোটাল চেক করেছে, কিন্তু ব্যবসা পোস্ট-ডিসকাউন্ট আশা করেছে (বা উল্টো), ফলে প্রোমো অপ্রত্যাশিতভাবে প্রয়োগ বা ব্যর্থ হয়ে যায়।\n- বাদ দেয়া আইটেমগুলোতেও কুপন প্রয়োগ হচ্ছে: যোগ্যতা প্রোডাক্ট ট্যাগের উপর নির্ভর করে, কিন্তু অনুপস্থিত বা অসঙ্গত ট্যাগিং (বা কোনো fallback) অজানা আইটেমকে যোগ্য বিবেচনা করে।\n\nএকটি কংক্রিট উদাহরণ: একটি কার্টে দুইটি আইটেম, একটি যোগ্য এবং একটি বাদ দেয়া। যদি ইঞ্জিন শতাংশ প্রোমোর জন্য সঠিকভাবে "যোগ্য সাবটোটাল" গণনা করে, কিন্তু পরে মোট-থেকে একটি ফিক্সড ডিসকাউন্ট বিয়োগ করে, তখন বাদ দেয়া আইটেমও সংক্ষিপ্তভাবে ডিসকাউন্ট পেতে পারে।\n\nসর্বোত্তম প্যাটার্ন হল প্রতিটি প্রোমোকে এক্সপ্লিসিট "যোগ্য পরিমাণ"-এর বিরুদ্ধে গণনা করা এবং একটি সীমাবদ্ধ সমন্বয় (কখনোও শূন্যের নিচে নয়) ফেরত দেওয়া, সাথে একটি স্পষ্ট ট্রেস যে কী টাচ করেছে। যদি আপনি Koder.ai-র মত টুলে আপনার ডিসকাউন্ট ইঞ্জিন জেনারেট করেন, ট্রেসটি প্লেইন ডেটা হিসেবে আউটপুট করুন যাতে আপনার টেস্টগুলো স্পষ্টভাবে কোন লাইনগুলো যোগ্য ছিল এবং কোন সাবটোটাল ব্যবহার করা হয়েছে তা ধার্য করতে পারে।\n\n## সঠিক টেস্ট সুইট দিয়ে নিয়মগুলো টেস্টেবল করুন\n\nঅধিকাংশ কুপন সমস্যা দেখা দেয় কারণ টেস্টগুলো কেবল চূড়ান্ত টোটাল চেক করে। একটি ভাল সুইট যোগ্যতা (এই প্রোমোটি প্রয়োগ হওয়া উচিত?) এবং গণিত (কতটা কেটে দেবে?)—উভয়ই চেক করে, সঙ্গে একটি পড়তে সহজ ব্রেকডাউন যাতে আপনি সময়ের সাথে তুলনা করতে পারেন।\n\n### ছোট থেকে বাস্তব কেস পর্যন্ত টেস্ট তৈরি করুন\n\nপ্রত্যেক নিয়মকে আলাদা করে ইউনিট টেস্ট দিয়ে শুরু করুন। ইনপুট ছোট রাখুন, তারপর পূর্ণ কার্ট সিনারিওতে বাড়ান।\n\n- যোগ্যতা ইউনিট টেস্ট: গ্রাহক টাইপ, তারিখ, প্রোডাক্ট ট্যাগ, এবং মিনিমাম স্পেন্ড অনুযায়ী প্রোমো প্রযোজ্য কি না?\n- গণিত ইউনিট টেস্ট: নির্দিষ্ট যোগ্য সাবটোটাল দিলে গণনা, রাউন্ডিং এবং কারেন্সি নিয়ম মেলে কি না?\n- সিনারিও টেস্ট: মিশ্র আইটেম, পরিমাণ, শিপিং, ট্যাক্স, এবং কয়েকটি প্রোমো যেগুলো প্রতিদ্বন্দ্বিতা করে।\n- "কার্ট পরিবর্তিত" টেস্ট: মূল্য আপডেট, আইটেম সরানো, বা পরিমাণ পরিবর্তন চেকআউটের মধ্যে।\n- ব্রেকডাউন স্ন্যাপশট টেস্ট: কেবল ফাইনাল টোটাল নয়, লাইন-বাই-লাইন ডিসকাউন্ট বরাদ্দ সংরক্ষণ করুন।\n\nআবরণ পেলে, কিছু "সবসময় সত্য" চেক যোগ করুন। এগুলো হাতছাড়া কেসগুলো ধরবে যেগুলো আপনি হাতে লিখে ভাবেননি।\n\n- মোট কখনো 0.00 এর নিচে যাবে না।\n- কোনো ডিসকাউন্ট মোট বাড়ায় না।\n- প্রয়োগকৃত ডিসকাউন্ট কখনো তার যোগ্য বেসের চেয়ে বড় নয়।\n- অযোগ্য আইটেম সরানোর ফলে ডিসকাউন্ট বড় হতে পারে না।\n\n### একটি ছোট কার্ট উদাহরণ\n\nমন করুণ একটি কার্টে 2টি আইটেম আছে: $40 শার্ট (যোগ্য) এবং $30 গিফট কার্ড (অবর্জিত)। শিপিং $7। একটি প্রোমো "অ্যাপারেলে 20% ছাড়, সর্বোচ্চ $15", আর দ্বিতীয় প্রোমো "$50 এর বেশি অর্ডারে $10 ছাড়" — যা শতাংশ ছাড়ের সঙ্গে স্ট্যাক করে না।\n\nআপনার সিনারিও টেস্টটি নিশ্চিত করবে কোন প্রোমো জিতেছে (প্রায়োরিটি), গিফটকার্ড বাদ পড়েছে, এবং সঠিক বরাদ্দ: $40 এর 20% = $8, শিপিং অপরিবর্তিত, চূড়ান্ত টোটাল সঠিক। সেই ব্রেকডাউনকে গোল্ডেন স্ন্যাপশট হিসেবে সংরক্ষণ করুন যাতে পরবর্তীতে রিফ্যাক্টরগুলো চুপিচুপি কোন প্রোমো প্রয়োগ হচ্ছে বদলে দেয়।\n\n## লঞ্চের আগে দ্রুত চেকলিস্ট\n\nনতুন প্রোমো শিপ করার আগে একটি চূড়ান্ত চেকলিস্ট চালান যা গ্রাহকরা তাড়াতাড়ি লক্ষ্য করে এমন ব্যর্থতাগুলো ধরবে: অদ্ভুত টোটাল, বিভ্রান্তিকর বার্তা, এবং রিফান্ড যে মিলছে না। এই চেকগুলো সাধারণ কুপন ত্রুটি ধরা সহায় করে, কারণ এগুলো নিয়মগুলোকে প্রতিটি কার্টে একইভাবে আচরণ করতে বাধ্য করে।\n\nএই পরীক্ষা গুলো "জটিল" কার্টের একটি ছোট সেটে চালান (একটি আইটেম, অনেক আইটেম, মিশ্র ট্যাক্স রেট, শিপিং, এবং একটি উচ্চ পরিমাণের লাইন)। কার্টগুলো সংরক্ষণ করুন যাতে আপনি প্রতিবার প্রাইসিং কোড পরিবর্তনের পর সেগুলো পুনরায় চালাতে পারেন।\n\n### পাঁচটি চেক যা বেশিরভাগ ব্যর্থতা ধরবে\n\n- : চূড়ান্ত অর্ডার টোটাল এবং প্রতিটি লাইনের নেট মূল্য কখনো শূন্যের নিচে যাবে না। যদি ডিসকাউন্ট অতিরিক্ত হয়, তাহলে তাকে কেপ করুন এবং কেপ করা পরিমাণ রেকর্ড করুন।\n- : ক্রেতাকে দেখানো ডিসকাউন্ট ব্রেকডাউন (প্রোমো অনুসারে, লাইন অনুসারে, শিপিং অনুসারে) অবশ্যই চূড়ান্ত প্রদত্ত টোটালের সমান হতে হবে। যদি এক বাক্যে ব্যাখ্যা করতে না পারেন, নিয়মগুলো অস্পষ্ট।\n- : কী স্ট্যাক করতে পারে ঠিক করুন (কুপন ও অটো প্রোমো, শতাংশ ও ফিক্সড, শিপিং ডিসকাউন্ট ও আইটেম ডিসকাউন্ট)। প্রায়োরিটি স্পষ্ট করুন এবং নিশ্চিত করুন এটা সাপোর্ট দল কী বলবে তার সাথে মিলছে।\n- : একটি রাউন্ডিং নিয়ম বাছুন (প্রতি-লাইন বনাম প্রতি-অর্ডার, half-up বনাম bankers, কারেন্সি-নির্দিষ্ট দশমিক)। এটি ডকুমেন্ট করুন এবং $0.99 মত দাম, পরিমাণ 3, এবং মিশ্র শতাংশ ডিসকাউন্ট দিয়ে টেস্ট করুন।\n- : আংশিক রিটার্ন সঠিক অংশ রিফান্ড করবে (ডিসকাউন্ট, ট্যাক্স, শিপিং)। টেস্ট করুন “3 থেকে 1 আইটেম রিটার্ন”, “প্রথমে ডিসকাউন্ট করা আইটেম ফেরত”, এবং “প্রোমো এক্সপায়ার হওয়ার পর রিফান্ড।”\n\nআপনি যদি Koder.ai-র মত জেনারেটরে আপনার ডিসকাউন্ট রুল গঠন করেন, এই কেসগুলো অটোমেটেড টেস্ট হিসেবে রুল ডেফিনিশনের পাশে যোগ করুন। লক্ষ্যটি সহজ: ভবিষ্যৎ কোনো প্রোমো টেস্টে দ্রুত ব্যর্থ হোক, গ্রাহকের কার্টে ব্যর্থ না হয়।\n\n## যাচাই করার জন্য একটি বাস্তবসম্মত স্ট্যাকিং সিনারিও\n\nএখানে একটি ছোট কার্ট আছে যা বেশিরভাগ কুপন লজিক সমস্যা উন্মোচন করে কিন্তু জটিল নয়।\n\nধরা যাক এই নিয়মগুলো (নিজ সিস্টেমে একেবারেই এইভাবে লিখে রাখুন):\n\n- অটো প্রোমো প্রথমে প্রয়োগ হয়, আইটেম-সতর্ক, কেবল যোগ্য পূর্ণ-মুল্যের আইটেমে\n- কুপন অর্ডার-সতর্ক, $15 ছাড়, অন্তত $100 যোগ্য পণ্য থাকতে হবে\n- "যোগ্য পণ্য" সেল আইটেম, শিপিং এবং ট্যাক্স বাদ দেয়\n- কুপন ডিসকাউন্ট আগের প্রোমোর পরে যোগ্য সাবটোটালের বেশি হতে পারবে না\n- ট্যাক্স ডিসকাউন্টের পরে গণনা করা হবে (রয়রা ডিসকাউন্ট করা পণ্য + শিপিং)\n\n### কার্ট এবং প্রোমোসমূহ\nকার্ট:\n\n| Line | Price | Notes |\n|---|---:|---|\n| Item A | $60 | full-price, eligible |\n| Item B | $40 | full-price, eligible |\n| Item C | $30 | sale item, excluded |\n| Shipping | $8 | fee |\n\nপ্রোমোসমূহ:\n\n- প্রোমো 1: যোগ্য আইটেমে স্বয়ংক্রিয় 10% উইকেন্ড সেল\n- প্রোমো 2: কুপন $15 ছাড়, মিন $100 যোগ্য ব্যয়, সেল আইটেম বাদ\n\n### ওয়াকথ্রু ও চূড়ান্ত ব্রেকডাউন\n1) কুপন মিনিমাম চেক করুন: ডিসকাউন্টের আগে যোগ্য পণ্য $60 + $40 = $100, তাই কুপন প্রয়োগ করা যাবে।\n\n2) প্রোমো 1 প্রয়োগ করুন (যোগ্য আইটেমে 10%): $100 x 10% = $10 ছাড়। যোগ্য সাবটোটাল হয়ে যায় $90।\n\n3) প্রোমো 2 প্রয়োগ করুন ($15 ছাড়): ক্যাপ $90, তাই পুরো $15 প্রযোজ্য। নতুন যোগ্য সাবটোটাল: $75।\n\nটোটালগুলো:\n\n- পণ্য: যোগ্য $75 + সেল আইটেম $30 = $105\n- শিপিং: $8\n- ট্যাক্স (8%): (105 + 8) x 0.08 = $9.04\n- চূড়ান্ত মোট: $105 + $8 + $9.04 = $122.04\n\nএখন একটি জিনিস বদলান: গ্রাহক Item B ($40) সরিয়ে দিল। যোগ্য পণ্য $60 হলো, তাই $15 কুপন মিনিমাম ব্যর্থ হবে। কেবল 10% অটো প্রোমো থাকবে: Item A $54 হবে, পণ্য $54 + $30 = $84, এবং চূড়ান্ত মোট হবে $99.36। এটাই সেই ছোট সম্পাদনা যা কার্ট ভাঙিয়ে দিতে পারে যদি যোগ্যতা ও অর্ডার স্পষ্ট না থাকে।\n\n## পরবর্তী ধাপ: নিরাপদে প্রোমো শিপ করুন এবং বজায় রাখুন\n\nকুপন লজিকের ফাঁদ এড়ানোর দ্রুততম উপায় হল প্রোমোকে প্রোডাক্ট রুল হিসেবে বিবেচনা করা, কেবল "চেকআউটে একটু ম্যাথ" নয়। শিপ করার আগে একটি সংক্ষিপ্ত স্পেক লিখুন যা দলের সবাই পড়ে একমত হবে।\n\nচারটি জিনিস সহজ ভাষায় অন্তর্ভুক্ত করুন:\n\n- স্ট্যাকিং নিয়ম (কি মিলিয়ে যায়, কি মিলিয়ে যায় না)\n- প্রায়োরিটি অর্ডার (যখন দুইটি একই আইটেম লক্ষ্য করে, কোনটা জিতবে)\n- এক্সক্লুউশন (ক্যাটাগরি, ব্র্যান্ড, সেল আইটেম, সাবস্ক্রিপশন, গিফটকার্ড)\n- ফ্লোর এবং ক্যাপ (মিন সাবটোটাল, সর্বোচ্চ ডিসকাউন্ট, এবং "কখনো - $0-এর নিচে নয়")\n\nরিলিজের পরে, টোটালগুলোকে তেমনি মনিটর করুন যেমন এররগুলো মনিটর করেন। একটি ডিসকাউন্ট বাগ প্রায়ই একটি বৈধ অর্ডার বলে মনে হয় যতক্ষণ না ফাইন্যান্স তা দেখে।\n\nমনিটরিং সেট করুন যা অস্বাভাবিক প্যাটার্ন ফ্ল্যাগ করে, যেমন নিকট-শূন্য টোটাল, নেতিবাচক টোটাল, সাবটোটালের চেয়ে বড় ডিসকাউন্ট, বা হঠাৎ করে "100% ছাড়" কার্ট স্পাইক। ঐ এলার্টগুলো একই স্থানে পাঠান যেখানে আপনার চেকআউট এরর যায়, এবং কিভাবে একটি প্রোমো নিরাপদে ডিসেবল করতে হয় তার সংক্ষিপ্ত প্লেবুক রাখুন।\n\nনতুন প্রোমো যোগ করার সময় রিগরস কাজ করুন: প্রথমে স্পেক আপডেট করুন, তারপর রুল ডেটা হিসেবে এনকোড করুন (ব্রাঞ্চিং কোড নয়), কয়েকটি সাধারণ কার্ট এবং এক বা দুইটা জটিল এজ কেসের জন্য টেস্ট যোগ করুন, তারপর মার্জ করার আগে পুরো ডিসকাউন্ট টেস্ট সুইট চালান।\n\nআপনি যদি দ্রুত ইমপ্লিমেন্ট ও ইটারেট করতে চান, Koder.ai-তে পরিকল্পনা মোডে প্রোমো ইঞ্জিন ফ্লো প্রোটোটাইপ করতে পারেন, তারপর স্ন্যাপশট ও রোলব্যাক ব্যবহার করে টেস্টগুলো পুনরুদ্ধার করুন। এটি আপনাকে নতুন নিয়ম দ্রুত ট্রাই করতে সাহায্য করে কোনো পরিচিত-ভাল সংস্করণ হারানো ছাড়াই।
Validate
Select eligible promos
Resolve stacking and priority
Apply calculations
Summarize totals
টোটালের গার্ডরেইল
ব্যাখ্যাযোগ্য গণিত
একটি স্ট্যাকিং নীতি, কোন আচমকা আচরণ নয়
রাউন্ডিং সঙ্গতিপূর্ণ
রিটার্ন ও রিফান্ড সঠিক
শেয়ার
কুপন লজিকের ফাঁদ: এমন স্ট্যাকিং নিয়ম যা কার্ট ভেঙে দেয় না | Koder.ai