Spaces:
Runtime error
Runtime error
| import json | |
| import random | |
| from typing import List, Dict, Any | |
| from uuid import uuid4 | |
| try: | |
| from models import Invoice, Receivable, VendorProfile | |
| except ImportError: | |
| try: | |
| from cashflowmanager.models import Invoice, Receivable, VendorProfile | |
| except ImportError: | |
| from ..models import Invoice, Receivable, VendorProfile | |
| def generate_company_profile(difficulty="medium"): | |
| starting_cash = 1000000 | |
| if difficulty == "easy": starting_cash = 1500000 | |
| elif difficulty == "hard": starting_cash = 500000 | |
| return { | |
| "name": f"Enterprise-{random.randint(100, 999)}", | |
| "starting_cash": starting_cash, | |
| "credit_limit": 500000, | |
| "revenue_target": 2000000 | |
| } | |
| def generate_vendors(n: int = 5, difficulty: str = "medium") -> List[Dict[str, Any]]: | |
| vendors = [] | |
| names = ["FastLogistics", "GlobalParts", "EnergyCo", "SecureCloud", "ProConsulting"] | |
| for i in range(min(n, len(names))): | |
| base_trust = 0.7 if difficulty == "easy" else 0.5 if difficulty == "medium" else 0.3 | |
| v = VendorProfile( | |
| id=f"v-{i}", | |
| name=names[i], | |
| trust_score=random.uniform(base_trust, base_trust + 0.2), | |
| negotiation_flexibility=random.uniform(0.2, 0.6) | |
| ) | |
| vendors.append(v.model_dump()) | |
| return vendors | |
| def generate_invoices(vendors: List[Dict[str, Any]], difficulty: str = "medium") -> List[Dict[str, Any]]: | |
| # Easy: 5 invoices, Medium: 10, Hard: 15 | |
| n = 5 if difficulty == "easy" else 10 if difficulty == "medium" else 15 | |
| invoices = [] | |
| # Hard mode has higher interest, late fees, and AMOUNTS | |
| int_mult = 0.5 if difficulty == "easy" else 1.0 if difficulty == "medium" else 2.0 | |
| amt_mult = 0.7 if difficulty == "easy" else 1.0 if difficulty == "medium" else 1.5 | |
| for _ in range(n): | |
| vendor = random.choice(vendors) | |
| inv = Invoice( | |
| id=str(uuid4())[:8], | |
| vendor_id=vendor["id"], | |
| amount=random.uniform(50000, 300000) * amt_mult, | |
| due_in=random.randint(1, 10), | |
| late_fee=random.uniform(5000, 20000) * int_mult, | |
| min_payment=random.uniform(10000, 50000), | |
| interest=random.uniform(0.01, 0.05) * int_mult, | |
| status="unpaid" | |
| ) | |
| invoices.append(inv.model_dump()) | |
| return invoices | |
| def generate_receivables(difficulty: str = "medium") -> List[Dict[str, Any]]: | |
| # Easy: 7 receivables, Medium: 5, Hard: 3 | |
| n = 7 if difficulty == "easy" else 5 if difficulty == "medium" else 3 | |
| receivables = [] | |
| # Hard mode has lower payment probability | |
| prob_base = 0.85 if difficulty == "easy" else 0.75 if difficulty == "medium" else 0.55 | |
| for i in range(n): | |
| rec = Receivable( | |
| id=f"r-{i}", | |
| customer_id=f"c-{i}", | |
| amount=random.uniform(100000, 500000), | |
| expected_in=random.randint(2, 12), | |
| probability=random.uniform(prob_base, prob_base + 0.1) | |
| ) | |
| receivables.append(rec.model_dump()) | |
| return receivables | |
| def generate_scenario(difficulty="medium"): | |
| vendors = generate_vendors(difficulty=difficulty) | |
| return { | |
| "company": generate_company_profile(difficulty=difficulty), | |
| "vendors": vendors, | |
| "initial_invoices": generate_invoices(vendors, difficulty=difficulty), | |
| "initial_receivables": generate_receivables(difficulty=difficulty), | |
| "hidden_events": [ | |
| {"day": random.randint(3, 7), "type": "cash_shock", "amount": -random.uniform(100000, 300000), "desc": "Equipment Failure"}, | |
| {"day": random.randint(5, 10), "type": "payment_delay", "target_id": "r-0", "delay": 3} | |
| ] | |
| } | |
| if __name__ == "__main__": | |
| scenario = generate_scenario() | |
| print(json.dumps(scenario, indent=2)) | |