demo seed change 2

This commit is contained in:
Urtzi Alfaro
2025-12-14 11:58:14 +01:00
parent ff830a3415
commit a030bd14c8
44 changed files with 3093 additions and 977 deletions

View File

@@ -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(