{"openapi":"3.1.0","info":{"title":"GET /api/v1/budgets/{budget_id}/vs-actual","version":"1.0.0","description":"Budget vs Actual"},"servers":[{"url":"https://api.ondayzero.com","description":"Production"}],"paths":{"/api/v1/budgets/{budget_id}/vs-actual":{"get":{"tags":["budgets"],"summary":"Budget vs Actual","description":"Compare budgeted amounts to actual performance.","operationId":"get_budget_vs_actual_api_v1_budgets__budget_id__vs_actual_get","parameters":[{"name":"budget_id","in":"path","required":true,"schema":{"type":"string","title":"Budget Id"}},{"name":"start_date","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Comparison period start date","title":"Start Date"},"description":"Comparison period start date"},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Comparison period end date","title":"End Date"},"description":"Comparison period end date"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-business-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Business-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetVsActualResponse"}}}},"401":{"description":"Unauthorized - Authentication required","content":{"application/json":{"example":{"detail":"Not authenticated"}}}},"403":{"description":"Forbidden - Insufficient permissions","content":{"application/json":{"example":{"detail":"Not enough permissions"}}}},"404":{"description":"Not Found - Resource does not exist","content":{"application/json":{"example":{"detail":"Resource not found"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"BudgetVsActualLineItem":{"properties":{"ledger_id":{"type":"string","title":"Ledger Id","description":"Ledger account UUID."},"ledger_name":{"type":"string","title":"Ledger Name","description":"Ledger account name."},"ledger_type":{"type":"string","title":"Ledger Type","description":"Ledger type (revenue, expense, etc.)."},"budget_amount":{"type":"integer","title":"Budget Amount","description":"Budgeted amount in cents."},"actual_amount":{"type":"integer","title":"Actual Amount","description":"Actual amount in cents."},"variance_amount":{"type":"integer","title":"Variance Amount","description":"Variance (actual - budget) in cents."},"variance_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Variance Percent","description":"Variance percentage."},"variance_type":{"$ref":"#/components/schemas/VarianceTypeEnum","description":"Favorable, unfavorable, or neutral."}},"type":"object","required":["ledger_id","ledger_name","ledger_type","budget_amount","actual_amount","variance_amount","variance_type"],"title":"BudgetVsActualLineItem","description":"Single line item in budget vs actual comparison."},"BudgetVsActualResponse":{"properties":{"budget_id":{"type":"string","title":"Budget Id","description":"Budget UUID."},"budget_name":{"type":"string","title":"Budget Name","description":"Budget name."},"business_id":{"type":"string","title":"Business Id","description":"Business UUID."},"business_name":{"type":"string","title":"Business Name","description":"Business name."},"start_date":{"type":"string","format":"date","title":"Start Date","description":"Report period start."},"end_date":{"type":"string","format":"date","title":"End Date","description":"Report period end."},"generated_at":{"type":"string","format":"date-time","title":"Generated At","description":"When report was generated."},"revenue":{"$ref":"#/components/schemas/BudgetVsActualSection","description":"Revenue section."},"expenses":{"$ref":"#/components/schemas/BudgetVsActualSection","description":"Expenses section."},"budgeted_net_income":{"type":"integer","title":"Budgeted Net Income","description":"Budgeted net income in cents."},"actual_net_income":{"type":"integer","title":"Actual Net Income","description":"Actual net income in cents."},"net_income_variance":{"type":"integer","title":"Net Income Variance","description":"Net income variance in cents."},"net_income_variance_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Net Income Variance Percent","description":"Net income variance %."},"net_income_variance_type":{"$ref":"#/components/schemas/VarianceTypeEnum","description":"Favorable or unfavorable."}},"type":"object","required":["budget_id","budget_name","business_id","business_name","start_date","end_date","generated_at","revenue","expenses","budgeted_net_income","actual_net_income","net_income_variance","net_income_variance_type"],"title":"BudgetVsActualResponse","description":"Complete budget vs actual comparison report."},"BudgetVsActualSection":{"properties":{"section_name":{"type":"string","title":"Section Name","description":"Section name (e.g., 'Revenue', 'Expenses')."},"items":{"items":{"$ref":"#/components/schemas/BudgetVsActualLineItem"},"type":"array","title":"Items","description":"Line items in this section"},"total_budget":{"type":"integer","title":"Total Budget","description":"Total budgeted for section."},"total_actual":{"type":"integer","title":"Total Actual","description":"Total actual for section."},"total_variance":{"type":"integer","title":"Total Variance","description":"Total variance for section."},"total_variance_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Variance Percent","description":"Total variance percentage."}},"type":"object","required":["section_name","total_budget","total_actual","total_variance"],"title":"BudgetVsActualSection","description":"Section in budget vs actual (revenue or expenses)."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VarianceTypeEnum":{"type":"string","enum":["favorable","unfavorable","neutral"],"title":"VarianceTypeEnum","description":"Variance classification."}},"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Token","description":"API token authentication. Format: `Bearer dz_...`"}}},"security":[{"BearerAuth":[]}]}