Orders & Disputes
Overview
Section titled “Overview”The orders module manages marketplace transactions from both buyer and seller perspectives, including a dispute resolution system.
Module path: src/lib/modules/orders/
Route: /orders
Order Data Model
Section titled “Order Data Model”interface Order { id: string; amountInCents: number; applicationFeeAmount: number; // 5% platform fee buyerId: string; sellerId: string; serviceId: string; packageId: string; checkoutSessionId: string; stripeAccountId: string; status: OrderStatus; disputeId?: string | null; createdAt: Timestamp; updatedAt: Timestamp;}
type OrderStatus = 'pending' | 'in_progress' | 'completed' | 'cancelled' | 'refunded';Firestore collection: marketplace_orders
Order Views
Section titled “Order Views”Two tabs on the orders page:
- Purchases - Orders where current user is the buyer
- Sales - Orders where current user is the seller
Filtering
Section titled “Filtering”- By status: pending, in_progress, completed, cancelled, refunded, disputed
- By search query
Order Stats
Section titled “Order Stats”- Pending count
- Completed count
- Disputed count
- Total spent (purchases) / Total earned (sales)
State Management
Section titled “State Management”ordersManager
Section titled “ordersManager”ordersManager.purchases; // Buyer ordersordersManager.sales; // Seller ordersordersManager.currentOrders; // Based on active tabordersManager.filteredOrders; // After status/search filtersordersManager.stats; // OrderStats aggregation
ordersManager.setView('purchases' | 'sales');ordersManager.setStatus(status);ordersManager.setSearchQuery(query);Dispute System
Section titled “Dispute System”Dispute Data Model
Section titled “Dispute Data Model”interface Dispute { id: string; orderId: string; reporterId: string; reporterRole: 'buyer' | 'seller'; description: string; evidence: DisputeEvidence[]; status: DisputeStatus; resolution: DisputeResolution; resolvedAt?: Timestamp; resolvedBy?: string; adminNotes?: string; createdAt: Timestamp; updatedAt: Timestamp;}
type DisputeStatus = 'open' | 'in_review' | 'resolved';type DisputeResolution = 'fee_refunded' | 'handle_directly' | null;
interface DisputeEvidence { id: string; url: string; name: string; type: string; size: number; uploadedAt: Timestamp;}Firestore collection: marketplace_disputes
Creating a Dispute
Section titled “Creating a Dispute”- User clicks “Report Issue” on an order card
- Enters description (min 20 characters)
- Uploads evidence files (max 5 files, 10MB each, images/PDFs)
- Files uploaded to Firebase Storage:
disputes/{orderId}/{fileId}_{filename} - Dispute created and linked to order via
disputeId - Email templates generated for admin, buyer, and seller
Dispute Resolution
Section titled “Dispute Resolution”Admin resolves with either:
fee_refunded- Platform fee refundedhandle_directly- Parties handle directly
disputesManager
Section titled “disputesManager”disputesManager.allDisputes; // Admin viewdisputesManager.userDisputes; // Current user's disputesdisputesManager.filteredDisputes; // After filters
disputesManager.createDispute(orderId, description, evidence, role);disputesManager.resolveDispute(disputeId, resolution, adminNotes);disputesManager.hasOpenDispute(orderId);Components
Section titled “Components”| Component | Purpose |
|---|---|
orders-list.svelte | Main view with tabs and filters |
orders-stats.svelte | Stats cards |
order-card.svelte | Individual order with actions |
order-details-modal.svelte | Full order information |
report-issue-modal.svelte | Dispute creation with file upload |
dispute-details-modal.svelte | Dispute information and evidence |
Order Actions
Section titled “Order Actions”Per order card:
- View Details - Full order information
- Message - Open chat with other party
- Report Issue - Create dispute (if no open dispute)
- View Dispute - See existing dispute details