New alert system and panel de control page
This commit is contained in:
@@ -11,6 +11,11 @@ import uuid
|
||||
from datetime import datetime, timezone, timedelta
|
||||
from typing import Optional
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent))
|
||||
from shared.utils.demo_dates import adjust_date_for_demo, BASE_REFERENCE_DATE
|
||||
|
||||
from app.core.database import get_db
|
||||
from app.models.forecasts import Forecast, PredictionBatch
|
||||
@@ -40,6 +45,7 @@ async def clone_demo_data(
|
||||
virtual_tenant_id: str,
|
||||
demo_account_type: str,
|
||||
session_id: Optional[str] = None,
|
||||
session_created_at: Optional[str] = None,
|
||||
db: AsyncSession = Depends(get_db),
|
||||
_: bool = Depends(verify_internal_api_key)
|
||||
):
|
||||
@@ -55,18 +61,35 @@ async def clone_demo_data(
|
||||
virtual_tenant_id: Target virtual tenant UUID
|
||||
demo_account_type: Type of demo account
|
||||
session_id: Originating session ID for tracing
|
||||
session_created_at: ISO timestamp when demo session was created (for date adjustment)
|
||||
|
||||
Returns:
|
||||
Cloning status and record counts
|
||||
"""
|
||||
start_time = datetime.now(timezone.utc)
|
||||
|
||||
# Parse session_created_at or fallback to now
|
||||
if session_created_at:
|
||||
try:
|
||||
session_time = datetime.fromisoformat(session_created_at.replace('Z', '+00:00'))
|
||||
except (ValueError, AttributeError) as e:
|
||||
logger.warning(
|
||||
"Invalid session_created_at format, using current time",
|
||||
session_created_at=session_created_at,
|
||||
error=str(e)
|
||||
)
|
||||
session_time = datetime.now(timezone.utc)
|
||||
else:
|
||||
logger.warning("session_created_at not provided, using current time")
|
||||
session_time = datetime.now(timezone.utc)
|
||||
|
||||
logger.info(
|
||||
"Starting forecasting data cloning",
|
||||
base_tenant_id=base_tenant_id,
|
||||
virtual_tenant_id=virtual_tenant_id,
|
||||
demo_account_type=demo_account_type,
|
||||
session_id=session_id
|
||||
session_id=session_id,
|
||||
session_time=session_time.isoformat()
|
||||
)
|
||||
|
||||
try:
|
||||
@@ -92,23 +115,21 @@ async def clone_demo_data(
|
||||
base_tenant=str(base_uuid)
|
||||
)
|
||||
|
||||
# Calculate date offset to make forecasts recent
|
||||
if base_forecasts:
|
||||
max_date = max(forecast.forecast_date for forecast in base_forecasts)
|
||||
today = datetime.now(timezone.utc)
|
||||
date_offset = today - max_date
|
||||
else:
|
||||
date_offset = timedelta(days=0)
|
||||
|
||||
for forecast in base_forecasts:
|
||||
adjusted_forecast_date = adjust_date_for_demo(
|
||||
forecast.forecast_date,
|
||||
session_time,
|
||||
BASE_REFERENCE_DATE
|
||||
) if forecast.forecast_date else None
|
||||
|
||||
new_forecast = Forecast(
|
||||
id=uuid.uuid4(),
|
||||
tenant_id=virtual_uuid,
|
||||
inventory_product_id=forecast.inventory_product_id, # Keep product reference
|
||||
product_name=forecast.product_name,
|
||||
location=forecast.location,
|
||||
forecast_date=forecast.forecast_date + date_offset,
|
||||
created_at=datetime.now(timezone.utc),
|
||||
forecast_date=adjusted_forecast_date,
|
||||
created_at=session_time,
|
||||
predicted_demand=forecast.predicted_demand,
|
||||
confidence_lower=forecast.confidence_lower,
|
||||
confidence_upper=forecast.confidence_upper,
|
||||
@@ -143,12 +164,23 @@ async def clone_demo_data(
|
||||
)
|
||||
|
||||
for batch in base_batches:
|
||||
adjusted_requested_at = adjust_date_for_demo(
|
||||
batch.requested_at,
|
||||
session_time,
|
||||
BASE_REFERENCE_DATE
|
||||
) if batch.requested_at else None
|
||||
adjusted_completed_at = adjust_date_for_demo(
|
||||
batch.completed_at,
|
||||
session_time,
|
||||
BASE_REFERENCE_DATE
|
||||
) if batch.completed_at else None
|
||||
|
||||
new_batch = PredictionBatch(
|
||||
id=uuid.uuid4(),
|
||||
tenant_id=virtual_uuid,
|
||||
batch_name=batch.batch_name,
|
||||
requested_at=batch.requested_at + date_offset,
|
||||
completed_at=batch.completed_at + date_offset if batch.completed_at else None,
|
||||
requested_at=adjusted_requested_at,
|
||||
completed_at=adjusted_completed_at,
|
||||
status=batch.status,
|
||||
total_products=batch.total_products,
|
||||
completed_products=batch.completed_products,
|
||||
|
||||
Reference in New Issue
Block a user