Dealer
Dashboard, orders, network, wallet, reports
Login & Registration
Login page renders with dealer role indicator when role=dealer in URL
Dealer login submits to correct endpoint and stores tokens
Error toast displayed on failed dealer login
Dealer registration redirects to payment link
Dealer register schema rejects registration without referral mobile
Logout clears all auth state and React Query cache
Login as new dealer clears previous user's cached data
Token refresh (same user) preserves existing cache
Dealer Dashboard
Dealer dashboard stats load from API correctly
Chart date/time-filter labels render correctly
Orders classified correctly by type in dashboard
Order List & Detail
Dealer order list loads from /dealer-orders
Order list shows empty state when no orders
Order detail disabled when orderId is not provided
Order detail loads correctly when orderId is set
Invoice URL retrieved for dealer's order
Order Actions
Dealer can cancel an order
Dealer can raise a return request
Dealer can cancel a return request
Profile
Dealer profile loads with correct role
Profile defaults to dealer role when role is null
Profile update invalidates cache on success
Profile photo upload updates user record
Gender must be M / F / T for dealer
Invalid email / Aadhaar / PAN rejected
Change Password
Dealer password changed via dealer endpoint
New password matching old password rejected
Server message displayed on success
Dealer Wallet
Dealer wallet logs load from dealer endpoint
Wallet balance loaded for authenticated dealer
Wallet balance disabled when unauthenticated
Commission wallet logs load from /dealer/commission-wallet
Commission wallet disabled for non-dealer roles
Wallet transfer POSTs correctly to /dealer/wallet-transfer
Transfer error propagated to user
Wallet transfer invalidates related queries on success
Dealer dashboard details loaded for dealer role
Dashboard details disabled for non-dealer roles
Transfer button visible for dealer on wallet page
Wallet Stats (Dealer)
Dealer stats show network breakdown from dashboard object
Missing dashboard fields default to ₹0
Falls back to credited/debited from logs when no dashboard
Amount Breakdown Modal
Commission breakdown modal shows all components + TDS + net
URL amount formatted to 4 decimal places
Modal closes when close button clicked
Dealer Withdrawals
Dealer withdrawal list loads from /dealer/withdrawals
Dealer withdrawal request submitted to /dealer-add-withdrawal
Withdrawal info (available balance etc.) loaded before form
"Not found" / "no data" API errors return empty list
Net credited amount = gross minus TDS for dealer
Short and full withdrawal date formats displayed correctly
Sub-dealer Network
Sub-dealer list (CNF1, CNF2, CNF3 tiers) loads correctly
Tier counts computed from resolved tiers
Empty tiers shown when server returns none
404 / "no records found" returns empty envelope (no crash)
Unrecognised errors are rethrown
Hook exposes error state on rejection
Referral Reports
Referral reports page renders rows when data resolves
Search input filters referral report rows
Empty state shown when API returns no records
Error state with retry shown when fetch fails
404 returns empty envelope instead of throwing
L1, L2, CNF report endpoints called with correct params
CNF Reports Page
CNF report row renders with correct data
Clicking Order ID opens order detail modal
Dash shown as fallback when name/mobile/order value missing
Search filters CNF rows
TDS Reports
TDS rows render with formatted withdrawal ID and amount
Stat cards show total / paid / unpaid TDS summary
Wallet Transfer and Withdrawal request-type badges shown
PAID / UNPAID status badges render correctly
Filtering by "paid" hides unpaid rows
Empty state shown with API message when no records
Error state shown when fetch rejects
TDS % defaults to 5% when field absent from API
Dash fallback when both withdrawal_id and id missing
Date Presets
"This Month" preset returns first-of-month to today
"Last Month" preset returns full previous month
"Last Month" in January correctly rolls back to December
"Last 30 days" preset returns 30 days back to today
Date range label formatted compactly for same-month range
Date range label formatted correctly for cross-month range
Pending Order Summary
Pending orders split by store type (Store Pickup / Online Order)
All amounts summed correctly across pending order types
Null/undefined amounts treated as 0
All zeros returned for empty order list
Order Badges
Status badge shows correct label and colour (Completed=green, Dispatched=blue, Pending=amber)
Status badge matching is case-insensitive
Store type badge: purple for Store Pickup, blue for Online Order
Store type badge defaults to "Online Order" when type missing
Order Modal
Order detail modal opens when Order ID clicked
Modal closes correctly via close action
Dealer Bank Accounts
Dealer bank accounts loaded from dealer endpoint (default)
Public bank list cached locally
IFSC uppercased, primary flag coerced
Contact & Site Info
Valid contact form submission accepted
Name too short rejected
Message under 10 characters rejected
Site info (call centre) fetched and cached
Site info not re-fetched when already in cache