"""
Pydantic models for the Shopify Omi plugin.
"""
from datetime import datetime
from typing import List, Optional, Any, Dict
from pydantic import BaseModel
from omi_plugin_sdk.models import Conversation, EndpointResponse, Structured, TranscriptSegment
class ShopifyCustomer(BaseModel):
"""Shopify customer information."""
id: Optional[int] = None
email: Optional[str] = None
first_name: Optional[str] = None
last_name: Optional[str] = None
phone: Optional[str] = None
orders_count: int = 0
total_spent: str = "0.00"
created_at: Optional[str] = None
tags: Optional[str] = None
class ShopifyAddress(BaseModel):
"""Shopify address information."""
first_name: Optional[str] = None
last_name: Optional[str] = None
address1: Optional[str] = None
address2: Optional[str] = None
city: Optional[str] = None
province: Optional[str] = None
country: Optional[str] = None
zip: Optional[str] = None
phone: Optional[str] = None
class ShopifyLineItem(BaseModel):
"""Shopify order line item."""
id: Optional[int] = None
title: str
quantity: int
price: str
sku: Optional[str] = None
variant_id: Optional[int] = None
product_id: Optional[int] = None
class ShopifyOrder(BaseModel):
"""Shopify order information."""
id: Optional[int] = None
order_number: Optional[int] = None
name: Optional[str] = None
email: Optional[str] = None
created_at: Optional[str] = None
updated_at: Optional[str] = None
financial_status: Optional[str] = None
fulfillment_status: Optional[str] = None
total_price: str = "0.00"
subtotal_price: str = "0.00"
total_tax: str = "0.00"
currency: str = "USD"
customer: Optional[ShopifyCustomer] = None
line_items: List[ShopifyLineItem] = []
shipping_address: Optional[ShopifyAddress] = None
billing_address: Optional[ShopifyAddress] = None
note: Optional[str] = None
tags: Optional[str] = None
class ShopifyAnalytics(BaseModel):
"""Shopify store analytics."""
total_sales: str = "0.00"
total_orders: int = 0
average_order_value: str = "0.00"
total_customers: int = 0
new_customers: int = 0
returning_customers: int = 0
top_products: List[Dict[str, Any]] = []
period: str = "today"
class ShopifyShop(BaseModel):
"""Shopify store information."""
id: int
name: str
email: str
domain: str
myshopify_domain: str
currency: str
money_format: str
timezone: str
plan_name: str
class ChatToolRequest(BaseModel):
"""Base request model for Omi chat tools."""
uid: str
app_id: str
tool_name: str
class GetAnalyticsRequest(ChatToolRequest):
"""Request model for getting analytics."""
period: str = "today"
class GetOrdersRequest(ChatToolRequest):
"""Request model for getting orders."""
status: Optional[str] = None
financial_status: Optional[str] = None
limit: int = 10
class GetOrderDetailsRequest(ChatToolRequest):
"""Request model for getting order details."""
order_id: Optional[str] = None
order_number: Optional[str] = None
class CreateOrderRequest(ChatToolRequest):
"""Request model for creating an order."""
customer_email: str
customer_first_name: Optional[str] = None
customer_last_name: Optional[str] = None
customer_phone: Optional[str] = None
line_items: List[Dict[str, Any]]
shipping_address: Optional[Dict[str, Any]] = None
note: Optional[str] = None
tags: Optional[str] = None
send_receipt: bool = True
financial_status: str = "pending"
class GetCustomersRequest(ChatToolRequest):
"""Request model for getting customers."""
query: Optional[str] = None
limit: int = 10
class CreateCustomerRequest(ChatToolRequest):
"""Request model for creating a customer."""
email: str
first_name: Optional[str] = None
last_name: Optional[str] = None
phone: Optional[str] = None
tags: Optional[str] = None
note: Optional[str] = None
accepts_marketing: bool = False
class ChatToolResponse(BaseModel):
"""Response model for Omi chat tools."""
result: Optional[str] = None
error: Optional[str] = None