E-shop Types

E-commerce type definitions

Type definitions for the E-shop module.

Product

interface Product {
  id: string;
  businessId: string;
  name: string;
  slug: string;
  description?: string;
  price: number;
  compareAtPrice?: number;
  sku?: string;
  inventory?: number;
  status: ResourceStatus;
  images: string[];
  categories: string[];
  metadata?: Record<string, unknown>;
  createdAt: number;
  updatedAt: number;
}

Order

interface Order {
  id: string;
  businessId: string;
  status: OrderStatus;
  items: OrderLineItem[];
  customer: Customer;
  shippingAddress?: Address;
  billingAddress?: Address;
  subtotal: number;
  discount: number;
  tax: number;
  shipping: number;
  total: number;
  promoCode?: string;
  notes?: string;
  trackingNumber?: string;
  trackingUrl?: string;
  payment?: Payment;
  createdAt: number;
  updatedAt: number;
  paidAt?: number;
  shippedAt?: number;
  deliveredAt?: number;
}

type OrderStatus =
  | 'PENDING'
  | 'PAID'
  | 'PROCESSING'
  | 'SHIPPED'
  | 'DELIVERED'
  | 'CANCELLED'
  | 'REFUNDED';

Order Line Item

interface OrderLineItem {
  id: string;
  productId: string;
  name: string;
  sku?: string;
  price: number;
  quantity: number;
  image?: string;
}

Payment

interface Payment {
  id: string;
  method: 'stripe';
  status: PaymentStatus;
  amount: number;
  currency: string;
  stripePaymentIntentId?: string;
  createdAt: number;
}

type PaymentStatus =
  | 'PENDING'
  | 'PROCESSING'
  | 'SUCCEEDED'
  | 'FAILED'
  | 'CANCELLED'
  | 'REFUNDED';

Quote

interface Quote {
  items: QuoteItem[];
  subtotal: number;
  discount: number;
  tax: number;
  shipping: number;
  total: number;
  promoCode?: PromoCodeInfo;
}

interface QuoteItem {
  productId: string;
  name: string;
  price: number;
  quantity: number;
  available: boolean;
}

interface PromoCodeInfo {
  code: string;
  type: PromoCodeType;
  value: number;
  description: string;
}

Checkout Response

interface CheckoutResponse {
  order: Order;
  requiresAction: boolean;
  clientSecret?: string;  // For 3D Secure
  redirectUrl?: string;
}

Promo Code

interface PromoCode {
  id: string;
  businessId: string;
  code: string;
  type: PromoCodeType;
  value: number;
  maxUses?: number;
  currentUses: number;
  maxUsesPerUser?: number;
  minOrderAmount?: number;
  products?: string[];
  services?: string[];
  startsAt?: number;
  expiresAt?: number;
  status: 'ACTIVE' | 'INACTIVE';
  createdAt: number;
}

type PromoCodeType = 'PERCENTAGE' | 'FIXED' | 'FREE_SHIPPING';

Cart (Client-Side)

interface CartItem {
  productId: string;
  name: string;
  price: number;
  quantity: number;
  image?: string;
  sku?: string;
}

interface Cart {
  items: CartItem[];
  subtotal: number;
  itemCount: number;
}

Product Category

interface ProductCategory {
  slug: string;
  name: string;
  description?: string;
  image?: string;
  parentSlug?: string;
  productCount: number;
}

Inventory Event

interface InventoryEvent {
  productId: string;
  type: 'INCREMENT' | 'DECREMENT' | 'SET';
  quantity: number;
  reason?: string;
  orderId?: string;
  timestamp: number;
}

Filter & Sort Options

interface ProductFilters {
  status?: ResourceStatus;
  category?: string;
  minPrice?: number;
  maxPrice?: number;
  inStock?: boolean;
  search?: string;
}

interface ProductSort {
  field: 'createdAt' | 'name' | 'price' | 'inventory';
  order: 'asc' | 'desc';
}