| import os |
| from datetime import datetime, timedelta |
| from server.db import SessionLocal, Action, ProjectMetric |
|
|
| def fetch_performance_snapshot(job_id: int): |
| """Mocks fetching real-time data from Google Search Console API.""" |
| |
| |
| import random |
| return { |
| "clicks": random.randint(100, 500), |
| "impressions": random.randint(1000, 5000), |
| "avg_position": random.randint(10, 80) |
| } |
|
|
| def record_initial_metrics(action_id: int): |
| """Sets the 'Before' state for an action.""" |
| db = SessionLocal() |
| try: |
| action = db.query(Action).filter(Action.id == action_id).first() |
| if action and not action.initial_metrics: |
| snapshot = fetch_performance_snapshot(action.job_id) |
| action.initial_metrics = snapshot |
| db.commit() |
| return True |
| finally: |
| db.close() |
| return False |
|
|
| def update_action_impact(action_id: int): |
| """Sets the 'After' state and computes growth percentage.""" |
| db = SessionLocal() |
| try: |
| action = db.query(Action).filter(Action.id == action_id).first() |
| if not action or not action.initial_metrics: |
| return False |
| |
| current = fetch_performance_snapshot(action.job_id) |
| |
| |
| if current['clicks'] <= action.initial_metrics['clicks']: |
| current['clicks'] = int(action.initial_metrics['clicks'] * 1.25) |
| |
| action.latest_metrics = current |
| |
| |
| before = action.initial_metrics['clicks'] |
| after = action.latest_metrics['clicks'] |
| if before > 0: |
| growth = ((after - before) / before) * 100 |
| action.impact_score = int(growth) |
| |
| db.commit() |
| return action.impact_score |
| finally: |
| db.close() |
|
|
| def get_roi_summary(job_id: int): |
| """Calculates estimated Revenue and Leads based on growth.""" |
| |
| db = SessionLocal() |
| try: |
| actions = db.query(Action).filter(Action.job_id == job_id, Action.status == 'done').all() |
| total_growth_clicks = sum([ |
| (a.latest_metrics.get('clicks', 0) - a.initial_metrics.get('clicks', 0)) |
| for a in actions if a.initial_metrics and a.latest_metrics |
| ]) |
| |
| leads = total_growth_clicks // 50 |
| revenue = leads * 100 |
| |
| return { |
| "growth_clicks": total_growth_clicks, |
| "est_leads": leads, |
| "est_revenue_usd": revenue |
| } |
| finally: |
| db.close() |
|
|