demo seed change 2
This commit is contained in:
@@ -12,11 +12,13 @@ from datetime import datetime, timezone, timedelta, date
|
||||
from typing import Optional
|
||||
import os
|
||||
from decimal import Decimal
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
from app.core.database import get_db
|
||||
from app.models.order import CustomerOrder, OrderItem
|
||||
from app.models.customer import Customer
|
||||
from shared.utils.demo_dates import adjust_date_for_demo, BASE_REFERENCE_DATE
|
||||
from shared.utils.demo_dates import adjust_date_for_demo, resolve_time_marker, get_next_workday
|
||||
|
||||
from app.core.config import settings
|
||||
|
||||
@@ -35,6 +37,59 @@ def verify_internal_api_key(x_internal_api_key: Optional[str] = Header(None)):
|
||||
return True
|
||||
|
||||
|
||||
def parse_date_field(date_value, session_time: datetime, field_name: str = "date") -> Optional[datetime]:
|
||||
"""
|
||||
Parse date field, handling both ISO strings and BASE_TS markers.
|
||||
|
||||
Supports:
|
||||
- BASE_TS markers: "BASE_TS + 1h30m", "BASE_TS - 2d"
|
||||
- ISO 8601 strings: "2025-01-15T06:00:00Z"
|
||||
- None values (returns None)
|
||||
|
||||
Returns timezone-aware datetime or None.
|
||||
"""
|
||||
if not date_value:
|
||||
return None
|
||||
|
||||
# Check if it's a BASE_TS marker
|
||||
if isinstance(date_value, str) and date_value.startswith("BASE_TS"):
|
||||
try:
|
||||
return resolve_time_marker(date_value, session_time)
|
||||
except ValueError as e:
|
||||
logger.warning(
|
||||
f"Invalid BASE_TS marker in {field_name}",
|
||||
marker=date_value,
|
||||
error=str(e)
|
||||
)
|
||||
return None
|
||||
|
||||
# Handle regular ISO date strings
|
||||
try:
|
||||
if isinstance(date_value, str):
|
||||
original_date = datetime.fromisoformat(date_value.replace('Z', '+00:00'))
|
||||
elif hasattr(date_value, 'isoformat'):
|
||||
original_date = date_value
|
||||
else:
|
||||
logger.warning(f"Unsupported date format in {field_name}", date_value=date_value)
|
||||
return None
|
||||
|
||||
return adjust_date_for_demo(original_date, session_time)
|
||||
except (ValueError, AttributeError) as e:
|
||||
logger.warning(
|
||||
f"Invalid date format in {field_name}",
|
||||
date_value=date_value,
|
||||
error=str(e)
|
||||
)
|
||||
return None
|
||||
|
||||
|
||||
def ensure_workday(target_date: datetime) -> datetime:
|
||||
"""Ensure delivery date falls on a workday (Monday-Friday)"""
|
||||
if target_date and target_date.weekday() >= 5: # Saturday or Sunday
|
||||
return get_next_workday(target_date)
|
||||
return target_date
|
||||
|
||||
|
||||
@router.post("/clone")
|
||||
async def clone_demo_data(
|
||||
base_tenant_id: str,
|
||||
@@ -180,11 +235,11 @@ async def clone_demo_data(
|
||||
total_orders=customer_data.get('total_orders', 0),
|
||||
total_spent=customer_data.get('total_spent', 0.0),
|
||||
average_order_value=customer_data.get('average_order_value', 0.0),
|
||||
last_order_date=adjust_date_for_demo(
|
||||
datetime.fromisoformat(customer_data['last_order_date'].replace('Z', '+00:00')),
|
||||
last_order_date=parse_date_field(
|
||||
customer_data.get('last_order_date'),
|
||||
session_time,
|
||||
BASE_REFERENCE_DATE
|
||||
) if customer_data.get('last_order_date') else None,
|
||||
"last_order_date"
|
||||
),
|
||||
created_at=session_time,
|
||||
updated_at=session_time
|
||||
)
|
||||
@@ -213,18 +268,18 @@ async def clone_demo_data(
|
||||
if customer_id_value:
|
||||
customer_id_value = customer_id_map.get(uuid.UUID(customer_id_value), uuid.UUID(customer_id_value))
|
||||
|
||||
# Adjust dates using demo_dates utility
|
||||
adjusted_order_date = adjust_date_for_demo(
|
||||
datetime.fromisoformat(order_data['order_date'].replace('Z', '+00:00')),
|
||||
# Parse date fields (supports BASE_TS markers and ISO timestamps)
|
||||
adjusted_order_date = parse_date_field(
|
||||
order_data.get('order_date'),
|
||||
session_time,
|
||||
BASE_REFERENCE_DATE
|
||||
) if order_data.get('order_date') else session_time
|
||||
"order_date"
|
||||
) or session_time
|
||||
|
||||
adjusted_requested_delivery = adjust_date_for_demo(
|
||||
datetime.fromisoformat(order_data['requested_delivery_date'].replace('Z', '+00:00')),
|
||||
adjusted_requested_delivery = parse_date_field(
|
||||
order_data.get('requested_delivery_date'),
|
||||
session_time,
|
||||
BASE_REFERENCE_DATE
|
||||
) if order_data.get('requested_delivery_date') else None
|
||||
"requested_delivery_date"
|
||||
)
|
||||
|
||||
# Create new order from seed data
|
||||
new_order = CustomerOrder(
|
||||
|
||||
Reference in New Issue
Block a user