🛒
E-Commerce & Payments

Online Shopping Cart

Cart, Discount Aur Checkout
💡 Shopping cart EK CHALTA-PHIRTA BILL hai. Har item add hone par bill update hota hai, coupon lagne par ghatta hai, aur checkout par wo bill FREEZE ho jaata hai — uske baad price badal nahi sakta.

Entities: Product, CartItem (product + quantity), Cart, Order, Payment. Sabse important design decision — CartItem mein price ka SNAPSHOT rakho, Product ka reference nahi. Agar seller kal price badal de to purane cart/order ka amount badalna BILKUL galat hoga.

Discounts ke liye Strategy + Chain use karo. Flat discount, percentage discount, BOGO, coupon — sab alag DiscountRule hain jo ek chain mein apply hote hain. Order of application matter karta hai (pehle item-level, phir cart-level) — ye clarify karna interviewer ko pasand aata hai.

class CartItem {
  private final String productId;
  private final Money unitPriceSnapshot;   // add karte waqt ka price, LOCK
  private int quantity;
}

interface DiscountRule {
  boolean applicable(Cart cart);
  Money discount(Cart cart);
}

class PricingEngine {
  Money finalAmount(Cart cart, List<DiscountRule> rules) {
    Money total = cart.subtotal();
    for (DiscountRule r : rules)
      if (r.applicable(cart)) total = total.minus(r.discount(cart));
    return total.plus(taxes(cart)).plus(shipping(cart));
  }
}
🛒
Shopping cart EK CHALTA-PHIRTA BILL hai. Har item add hone par bill update hota hai, coupon lagne par ghatta hai, aur checkout par wo bill FREEZE ho jaata hai — uske baad price badal nahi sakta.
1 / 2
⚡ Quick Recap
  • CartItem mein price ka snapshot rakho, live product price mat padho
  • Discounts alag-alag DiscountRule, chain mein apply
  • Item-level pehle, cart-level baad mein — order clarify karo
Is page mein (2 subtopics)

Guest user ka cart browser/session mein hota hai, logged-in user ka cart DB mein. Login karte waqt dono ko MERGE karna padta hai — ye ek real requirement hai jo log bhool jaate hain.

Merge rule clarify karo: same product dono mein ho to quantity jodni hai ya zyada waali leni hai? Ye poochna hi tumhe detail-oriented dikhata hai.

Cart merge(Cart guestCart, Cart userCart) {
  for (CartItem g : guestCart.items()) {
    userCart.findItem(g.productId())
        .ifPresentOrElse(u -> u.addQuantity(g.quantity()),
                         () -> userCart.add(g));
  }
  return userCart;
}

Checkout par sirf paisa lena nahi hota — pehle REVALIDATE karo: kya sab items abhi bhi available hain, kya price badla to nahi, kya coupon abhi bhi valid hai, kya delivery us pincode par hoti hai.

Cart mein item 3 din pehle daala ho sakta hai. Bina revalidation ke checkout karna out-of-stock order create kar dega, jo customer experience ka sabse bada issue hai.

💡Tip: Price badalne par kya karna hai ye business decision hai — user ko batao aur confirm karao, ya purana price honour karo. Dono valid hain; poochna important hai.