# Models

## The AccountDetail object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"AccountDetail":{"type":"object","description":"Detailed version with transaction summary.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string"},"description":{"type":"string","nullable":true},"account_code":{"type":"string","maxLength":20},"account_type":{"enum":["asset","liability","equity","income","expense"],"type":"string","description":"* `asset` - Asset\n* `liability` - Liability\n* `equity` - Equity\n* `income` - Income\n* `expense` - Expense"},"account_type_display":{"type":"string","readOnly":true},"account_category":{"enum":["current_assets","fixed_assets","intangible_assets","current_liabilities","long_term_liabilities","owner_equity","retained_earnings","operating_income","other_income","cost_of_goods_sold","operating_expenses","administrative_expenses","financial_expenses","other_expenses"],"type":"string","description":"* `current_assets` - Current Assets\n* `fixed_assets` - Fixed Assets\n* `intangible_assets` - Intangible Assets\n* `current_liabilities` - Current Liabilities\n* `long_term_liabilities` - Long-term Liabilities\n* `owner_equity` - Owner Equity\n* `retained_earnings` - Retained Earnings\n* `operating_income` - Operating Income\n* `other_income` - Other Income\n* `cost_of_goods_sold` - Cost of Goods Sold\n* `operating_expenses` - Operating Expenses\n* `administrative_expenses` - Administrative Expenses\n* `financial_expenses` - Financial Expenses\n* `other_expenses` - Other Expenses"},"account_category_display":{"type":"string","readOnly":true},"parent_account":{"allOf":[{"$ref":"#/components/schemas/AccountParent"}],"readOnly":true},"full_account_code":{"type":"string","readOnly":true},"account_path":{"type":"string","readOnly":true},"current_balance":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Current account balance (calculated from transactions)"},"is_active":{"type":"boolean"},"is_system_account":{"type":"boolean","description":"System accounts cannot be deleted"},"has_sub_accounts":{"type":"boolean","readOnly":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/FinancePersonMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"last_updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"sub_accounts_count":{"type":"integer","readOnly":true},"transaction_count":{"type":"integer","readOnly":true}},"required":["account_category","account_category_display","account_code","account_path","account_type","account_type_display","created_by","current_balance","date_created","full_account_code","has_sub_accounts","last_updated","name","parent_account","sub_accounts_count","transaction_count"]},"AccountParent":{"type":"object","description":"Minimal serializer for parent account references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"account_code":{"type":"string","maxLength":20},"name":{"type":"string","readOnly":true},"account_type":{"enum":["asset","liability","equity","income","expense"],"type":"string","description":"* `asset` - Asset\n* `liability` - Liability\n* `equity` - Equity\n* `income` - Income\n* `expense` - Expense"}},"required":["account_code","account_type","name"]},"FinancePersonMini":{"type":"object","description":"Lightweight serializer for Person model.\nUsed for nested person references in financial documents.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","readOnly":true}},"required":["full_name"]}}}}
```

## The AccountList object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"AccountList":{"type":"object","description":"Lightweight version for list views.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string"},"account_code":{"type":"string","maxLength":20},"full_account_code":{"type":"string","readOnly":true},"account_type":{"enum":["asset","liability","equity","income","expense"],"type":"string","description":"* `asset` - Asset\n* `liability` - Liability\n* `equity` - Equity\n* `income` - Income\n* `expense` - Expense"},"account_type_display":{"type":"string","readOnly":true},"account_category":{"enum":["current_assets","fixed_assets","intangible_assets","current_liabilities","long_term_liabilities","owner_equity","retained_earnings","operating_income","other_income","cost_of_goods_sold","operating_expenses","administrative_expenses","financial_expenses","other_expenses"],"type":"string","description":"* `current_assets` - Current Assets\n* `fixed_assets` - Fixed Assets\n* `intangible_assets` - Intangible Assets\n* `current_liabilities` - Current Liabilities\n* `long_term_liabilities` - Long-term Liabilities\n* `owner_equity` - Owner Equity\n* `retained_earnings` - Retained Earnings\n* `operating_income` - Operating Income\n* `other_income` - Other Income\n* `cost_of_goods_sold` - Cost of Goods Sold\n* `operating_expenses` - Operating Expenses\n* `administrative_expenses` - Administrative Expenses\n* `financial_expenses` - Financial Expenses\n* `other_expenses` - Other Expenses"},"account_category_display":{"type":"string","readOnly":true},"current_balance":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Current account balance (calculated from transactions)"},"is_active":{"type":"boolean"},"has_sub_accounts":{"type":"boolean","readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["account_category","account_category_display","account_code","account_type","account_type_display","current_balance","date_created","full_account_code","has_sub_accounts","name"]}}}}
```

## The AccountParent object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"AccountParent":{"type":"object","description":"Minimal serializer for parent account references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"account_code":{"type":"string","maxLength":20},"name":{"type":"string","readOnly":true},"account_type":{"enum":["asset","liability","equity","income","expense"],"type":"string","description":"* `asset` - Asset\n* `liability` - Liability\n* `equity` - Equity\n* `income` - Income\n* `expense` - Expense"}},"required":["account_code","account_type","name"]}}}}
```

## The AccountParentRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"AccountParentRequest":{"type":"object","description":"Minimal serializer for parent account references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"account_code":{"type":"string","minLength":1,"maxLength":20},"account_type":{"enum":["asset","liability","equity","income","expense"],"type":"string","description":"* `asset` - Asset\n* `liability` - Liability\n* `equity` - Equity\n* `income` - Income\n* `expense` - Expense"}},"required":["account_code","account_type"]}}}}
```

## The AccountRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"AccountRequest":{"type":"object","description":"Comprehensive serializer for Account model.\nHandles chart of accounts with multilingual support and hierarchy.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","minLength":1},"description":{"type":"string","nullable":true},"account_code":{"type":"string","minLength":1,"maxLength":20},"account_type":{"enum":["asset","liability","equity","income","expense"],"type":"string","description":"* `asset` - Asset\n* `liability` - Liability\n* `equity` - Equity\n* `income` - Income\n* `expense` - Expense"},"account_category":{"enum":["current_assets","fixed_assets","intangible_assets","current_liabilities","long_term_liabilities","owner_equity","retained_earnings","operating_income","other_income","cost_of_goods_sold","operating_expenses","administrative_expenses","financial_expenses","other_expenses"],"type":"string","description":"* `current_assets` - Current Assets\n* `fixed_assets` - Fixed Assets\n* `intangible_assets` - Intangible Assets\n* `current_liabilities` - Current Liabilities\n* `long_term_liabilities` - Long-term Liabilities\n* `owner_equity` - Owner Equity\n* `retained_earnings` - Retained Earnings\n* `operating_income` - Operating Income\n* `other_income` - Other Income\n* `cost_of_goods_sold` - Cost of Goods Sold\n* `operating_expenses` - Operating Expenses\n* `administrative_expenses` - Administrative Expenses\n* `financial_expenses` - Financial Expenses\n* `other_expenses` - Other Expenses"},"parent_account_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"is_active":{"type":"boolean"},"is_system_account":{"type":"boolean","description":"System accounts cannot be deleted"}},"required":["account_category","account_code","account_type","name"]}}}}
```

## The Address object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"Address":{"type":"object","description":"Serializer for Address model with essential location fields.","properties":{"address_line_1":{"type":"string","nullable":true,"maxLength":300},"city":{"type":"string","nullable":true,"maxLength":300},"province_state":{"type":"string","nullable":true,"title":"Province/State","maxLength":300},"postal_code":{"type":"string","nullable":true,"maxLength":300},"country_name":{"type":"string","readOnly":true}},"required":["country_name"]}}}}
```

## The AddressRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"AddressRequest":{"type":"object","description":"Serializer for Address model with essential location fields.","properties":{"address_line_1":{"type":"string","nullable":true,"maxLength":300},"city":{"type":"string","nullable":true,"maxLength":300},"province_state":{"type":"string","nullable":true,"title":"Province/State","maxLength":300},"postal_code":{"type":"string","nullable":true,"maxLength":300}}}}}}
```

## The AssetDetail object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"AssetDetail":{"type":"object","description":"Detailed serializer for single asset retrieval.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true},"asset_code":{"type":"string","nullable":true,"maxLength":100},"serial_number":{"type":"string","nullable":true,"maxLength":200},"asset_type":{"enum":["ppe","equipment","furniture","vehicle","computer","software","building","land","intangible","other"],"type":"string","description":"* `ppe` - Property, Plant & Equipment\n* `equipment` - Equipment\n* `furniture` - Furniture & Fixtures\n* `vehicle` - Vehicle\n* `computer` - Computer & IT Equipment\n* `software` - Software\n* `building` - Building\n* `land` - Land\n* `intangible` - Intangible Asset\n* `other` - Other"},"category":{"type":"string","nullable":true,"maxLength":200},"brand":{"type":"string","nullable":true,"maxLength":200},"model":{"type":"string","nullable":true,"maxLength":200},"purchase_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","description":"Original purchase price"},"useful_life_years":{"type":"integer","maximum":100,"minimum":1,"title":"Useful Life (Years)","description":"Expected useful life in years"},"purchase_date":{"type":"string","format":"date"},"warranty_expiry_date":{"type":"string","format":"date","nullable":true},"disposal_date":{"type":"string","format":"date","nullable":true},"status":{"enum":["active","inactive","disposed","sold","damaged","under_repair","stolen"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `disposed` - Disposed\n* `sold` - Sold\n* `damaged` - Damaged\n* `under_repair` - Under Repair\n* `stolen` - Stolen"},"condition":{"enum":["excellent","good","fair","poor","damaged"],"type":"string","description":"* `excellent` - Excellent\n* `good` - Good\n* `fair` - Fair\n* `poor` - Poor\n* `damaged` - Damaged"},"location":{"type":"string","nullable":true,"maxLength":300},"assigned_to":{"allOf":[{"$ref":"#/components/schemas/AssetPersonMini"}],"readOnly":true},"image_url":{"type":"string","nullable":true,"readOnly":true},"receipt_document_url":{"type":"string","nullable":true,"readOnly":true},"supplier_name":{"type":"string","nullable":true,"maxLength":300},"purchase_order_number":{"type":"string","nullable":true,"maxLength":100},"invoice_number":{"type":"string","nullable":true,"maxLength":100},"created_by":{"allOf":[{"$ref":"#/components/schemas/AssetPersonMini"}],"readOnly":true},"is_warranty_expired":{"type":"boolean","readOnly":true},"years_since_purchase":{"type":"integer","nullable":true,"readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["assigned_to","created_by","description","image_url","is_warranty_expired","name","purchase_date","purchase_price","receipt_document_url","years_since_purchase"]},"AssetPersonMini":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","readOnly":true}},"required":["full_name"]}}}}
```

## The AssetList object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"AssetList":{"type":"object","description":"Lightweight serializer for asset lists.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"asset_code":{"type":"string","nullable":true,"maxLength":100},"serial_number":{"type":"string","nullable":true,"maxLength":200},"asset_type":{"enum":["ppe","equipment","furniture","vehicle","computer","software","building","land","intangible","other"],"type":"string","description":"* `ppe` - Property, Plant & Equipment\n* `equipment` - Equipment\n* `furniture` - Furniture & Fixtures\n* `vehicle` - Vehicle\n* `computer` - Computer & IT Equipment\n* `software` - Software\n* `building` - Building\n* `land` - Land\n* `intangible` - Intangible Asset\n* `other` - Other"},"category":{"type":"string","nullable":true,"maxLength":200},"brand":{"type":"string","nullable":true,"maxLength":200},"model":{"type":"string","nullable":true,"maxLength":200},"purchase_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","description":"Original purchase price"},"purchase_date":{"type":"string","format":"date"},"status":{"enum":["active","inactive","disposed","sold","damaged","under_repair","stolen"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `disposed` - Disposed\n* `sold` - Sold\n* `damaged` - Damaged\n* `under_repair` - Under Repair\n* `stolen` - Stolen"},"condition":{"enum":["excellent","good","fair","poor","damaged"],"type":"string","description":"* `excellent` - Excellent\n* `good` - Good\n* `fair` - Fair\n* `poor` - Poor\n* `damaged` - Damaged"},"location":{"type":"string","nullable":true,"maxLength":300},"assigned_to":{"allOf":[{"$ref":"#/components/schemas/AssetPersonMini"}],"readOnly":true},"image_url":{"type":"string","nullable":true,"readOnly":true},"is_warranty_expired":{"type":"boolean","readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true}},"required":["assigned_to","image_url","is_warranty_expired","name","purchase_date","purchase_price"]},"AssetPersonMini":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","readOnly":true}},"required":["full_name"]}}}}
```

## The AssetPersonMini object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"AssetPersonMini":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","readOnly":true}},"required":["full_name"]}}}}
```

## The AssetPersonMiniRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"AssetPersonMiniRequest":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100}}}}}}
```

## The AssetRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"AssetRequest":{"type":"object","description":"Full serializer for Asset creation and updates.\nHandles translatable fields correctly.","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","nullable":true},"asset_code":{"type":"string","nullable":true,"maxLength":100},"serial_number":{"type":"string","nullable":true,"maxLength":200},"asset_type":{"enum":["ppe","equipment","furniture","vehicle","computer","software","building","land","intangible","other"],"type":"string","description":"Asset type is required.\n\n* `ppe` - Property, Plant & Equipment\n* `equipment` - Equipment\n* `furniture` - Furniture & Fixtures\n* `vehicle` - Vehicle\n* `computer` - Computer & IT Equipment\n* `software` - Software\n* `building` - Building\n* `land` - Land\n* `intangible` - Intangible Asset\n* `other` - Other"},"category":{"type":"string","nullable":true,"maxLength":200},"brand":{"type":"string","nullable":true,"maxLength":200},"model":{"type":"string","nullable":true,"maxLength":200},"purchase_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","description":"Purchase price is required and must be non-negative."},"useful_life_years":{"type":"integer","maximum":100,"minimum":1,"title":"Useful Life (Years)","description":"Expected useful life in years"},"purchase_date":{"type":"string","format":"date","description":"Purchase date is required."},"warranty_expiry_date":{"type":"string","format":"date","nullable":true},"disposal_date":{"type":"string","format":"date","nullable":true},"status":{"enum":["active","inactive","disposed","sold","damaged","under_repair","stolen"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `disposed` - Disposed\n* `sold` - Sold\n* `damaged` - Damaged\n* `under_repair` - Under Repair\n* `stolen` - Stolen"},"condition":{"enum":["excellent","good","fair","poor","damaged"],"type":"string","description":"* `excellent` - Excellent\n* `good` - Good\n* `fair` - Fair\n* `poor` - Poor\n* `damaged` - Damaged"},"location":{"type":"string","nullable":true,"maxLength":300},"assigned_to_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1,"description":"Unique ID of person to assign asset to"},"image":{"type":"string","format":"binary","nullable":true,"title":"Asset Image","description":"Asset image for identification"},"receipt_document":{"type":"string","format":"binary","nullable":true,"title":"Receipt/Invoice Document","description":"Upload receipt, invoice, or purchase document (PDF, DOC, DOCX, JPG, PNG)"},"supplier_name":{"type":"string","nullable":true,"maxLength":300},"purchase_order_number":{"type":"string","nullable":true,"maxLength":100},"invoice_number":{"type":"string","nullable":true,"maxLength":100}},"required":["asset_type","name","purchase_date","purchase_price"]}}}}
```

## The BankingInformation object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"BankingInformation":{"type":"object","description":"Serializer for BankingInformation with PII hygiene:\n- `account_number` is write-only\n- expose masked `account_number_last4` for reads","properties":{"bank_name":{"type":"string","nullable":true,"maxLength":200},"account_number_last4":{"type":"string","nullable":true,"readOnly":true},"branch_code":{"type":"string","nullable":true,"maxLength":50},"account_type":{"enum":["checking","savings","business","other","",null],"type":"string","description":"* `checking` - Checking\n* `savings` - Savings\n* `business` - Business\n* `other` - Other","nullable":true},"routing_number":{"type":"string","nullable":true,"maxLength":50},"swift_code":{"type":"string","nullable":true,"maxLength":50},"date_created":{"type":"string","format":"date-time","readOnly":true},"last_updated":{"type":"string","format":"date-time","readOnly":true},"account_type_display":{"type":"string","readOnly":true}},"required":["account_number_last4","account_type_display","date_created","last_updated"]}}}}
```

## The BankingInformationRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"BankingInformationRequest":{"type":"object","description":"Serializer for BankingInformation with PII hygiene:\n- `account_number` is write-only\n- expose masked `account_number_last4` for reads","properties":{"bank_name":{"type":"string","nullable":true,"maxLength":200},"account_number":{"type":"string","writeOnly":true},"branch_code":{"type":"string","nullable":true,"maxLength":50},"account_type":{"enum":["checking","savings","business","other","",null],"type":"string","description":"* `checking` - Checking\n* `savings` - Savings\n* `business` - Business\n* `other` - Other","nullable":true},"routing_number":{"type":"string","nullable":true,"maxLength":50},"swift_code":{"type":"string","nullable":true,"maxLength":50}}}}}}
```

## The Bill object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"Bill":{"type":"object","description":"Comprehensive serializer for Bill model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string"},"description":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"bill_number":{"type":"string","maxLength":100},"supplier_invoice_number":{"type":"string","nullable":true,"maxLength":100},"status":{"enum":["received","approved","paid","partially_paid","overdue","disputed","cancelled"],"type":"string","description":"* `received` - Received\n* `approved` - Approved for Payment\n* `paid` - Paid\n* `partially_paid` - Partially Paid\n* `overdue` - Overdue\n* `disputed` - Disputed\n* `cancelled` - Cancelled"},"status_display":{"type":"string","readOnly":true},"vendor":{"allOf":[{"$ref":"#/components/schemas/FinanceExpenseVendorMini"}],"readOnly":true},"bill_date":{"type":"string","format":"date"},"due_date":{"type":"string","format":"date"},"received_date":{"type":"string","format":"date"},"paid_date":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"tax_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Tax Rate (%)"},"tax_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"paid_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"remaining_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true},"payment_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","readOnly":true},"is_overdue":{"type":"boolean","readOnly":true},"document":{"type":"string","format":"uri","nullable":true,"title":"Bill Document","description":"Scanned bill document (PDF, image)"},"document_url":{"type":"string","nullable":true,"readOnly":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/FinancePersonMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"last_updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["bill_date","bill_number","created_by","date_created","document_url","due_date","is_overdue","last_updated","paid_date","payment_percentage","remaining_amount","status_display","subtotal","title","total_amount","vendor"]},"FinanceExpenseVendorMini":{"type":"object","description":"Lightweight serializer for Vendor references.","properties":{"unique_id":{"type":"string"},"name":{"type":"string","readOnly":true}},"required":["name","unique_id"]},"FinancePersonMini":{"type":"object","description":"Lightweight serializer for Person model.\nUsed for nested person references in financial documents.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","readOnly":true}},"required":["full_name"]}}}}
```

## The BillList object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"BillList":{"type":"object","description":"Lightweight version for list views.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string"},"bill_number":{"type":"string","maxLength":100},"supplier_invoice_number":{"type":"string","nullable":true,"maxLength":100},"status":{"enum":["received","approved","paid","partially_paid","overdue","disputed","cancelled"],"type":"string","description":"* `received` - Received\n* `approved` - Approved for Payment\n* `paid` - Paid\n* `partially_paid` - Partially Paid\n* `overdue` - Overdue\n* `disputed` - Disputed\n* `cancelled` - Cancelled"},"status_display":{"type":"string","readOnly":true},"vendor":{"allOf":[{"$ref":"#/components/schemas/FinanceExpenseVendorMini"}],"readOnly":true},"bill_date":{"type":"string","format":"date"},"due_date":{"type":"string","format":"date"},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"paid_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"remaining_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true},"is_overdue":{"type":"boolean","readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["bill_date","bill_number","date_created","due_date","is_overdue","remaining_amount","status_display","title","total_amount","vendor"]},"FinanceExpenseVendorMini":{"type":"object","description":"Lightweight serializer for Vendor references.","properties":{"unique_id":{"type":"string"},"name":{"type":"string","readOnly":true}},"required":["name","unique_id"]}}}}
```

## The BillRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"BillRequest":{"type":"object","description":"Comprehensive serializer for Bill model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string","minLength":1},"description":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"bill_number":{"type":"string","minLength":1,"maxLength":100},"supplier_invoice_number":{"type":"string","nullable":true,"maxLength":100},"status":{"enum":["received","approved","paid","partially_paid","overdue","disputed","cancelled"],"type":"string","description":"* `received` - Received\n* `approved` - Approved for Payment\n* `paid` - Paid\n* `partially_paid` - Partially Paid\n* `overdue` - Overdue\n* `disputed` - Disputed\n* `cancelled` - Cancelled"},"vendor_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"bill_date":{"type":"string","format":"date"},"due_date":{"type":"string","format":"date"},"received_date":{"type":"string","format":"date"},"subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"tax_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Tax Rate (%)"},"tax_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"paid_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"document":{"type":"string","format":"binary","nullable":true,"title":"Bill Document","description":"Scanned bill document (PDF, image)"}},"required":["bill_date","bill_number","due_date","subtotal","title","total_amount"]}}}}
```

## The Client object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"Client":{"type":"object","description":"Comprehensive serializer for Client model.\nHandles multilingual fields, nested relationships, and computed fields.\nOptimized for list and detail views with optional prefetching support.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","maxLength":300},"description":{"type":"string","nullable":true},"entity_type":{"enum":["individual","company","non_profit","government","partnership","other"],"type":"string","description":"* `individual` - Individual\n* `company` - Company\n* `non_profit` - Non-Profit Organization\n* `government` - Government Entity\n* `partnership` - Partnership\n* `other` - Other"},"entity_type_display":{"type":"string","nullable":true,"readOnly":true},"lifecycle_stage":{"enum":["prospect","active_client","matured_client","inactive","dormant","lost_opportunity"],"type":"string","description":"* `prospect` - Prospect\n* `active_client` - Active Client\n* `matured_client` - Matured Client\n* `inactive` - Inactive\n* `dormant` - Dormant\n* `lost_opportunity` - Lost Opportunity","title":"Client Lifecycle Stage"},"lifecycle_stage_display":{"type":"string","nullable":true,"readOnly":true},"industry":{"enum":["agriculture","cleaning","construction","consulting","creative","education","events","handyman","health","home_based","hospitality","it_support","legal","logistics","manufacturing","marketing","music","non_profit","online_retail","photography","printing","professional","travel","utilities","wholesale","writing","virtual_assistance","other","",null],"type":"string","description":"* `agriculture` - Agriculture and Farming\n* `cleaning` - Cleaning Services\n* `construction` - Construction and Real Estate Services\n* `consulting` - Consulting and Freelancing\n* `creative` - Creative and Design Services\n* `education` - Education and Tutoring Services\n* `events` - Entertainment and Events Planning\n* `handyman` - Handyman and Home Repair Services\n* `health` - Health and Wellness\n* `home_based` - Home-Based Businesses\n* `hospitality` - Hospitality and Tourism\n* `it_support` - IT and Software Support Services\n* `legal` - Legal and Financial Services\n* `logistics` - Logistics and Delivery Services\n* `manufacturing` - Manufacturing and Small-Scale Production\n* `marketing` - Marketing and Advertising Services\n* `music` - Music and Entertainment Services\n* `non_profit` - Non-Profit and Social Enterprises\n* `online_retail` - Online Retail and E-commerce\n* `photography` - Photography and Videography Services\n* `printing` - Printing and Copy Services\n* `professional` - Professional Services\n* `travel` - Travel Agencies\n* `utilities` - Utilities and Renewable Energy Services\n* `wholesale` - Wholesale and Distribution\n* `writing` - Writing and Editing Services\n* `virtual_assistance` - Virtual Assistance and Admin Support\n* `other` - Other","nullable":true},"industry_display":{"type":"string","nullable":true,"readOnly":true},"website":{"type":"string","format":"uri","nullable":true,"maxLength":300},"company_size":{"type":"string","nullable":true,"maxLength":100},"annual_revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Annual revenue in USD"},"default_currency":{"type":"string","description":"Default currency code (ISO 4217) for this entity's transactions","maxLength":3},"first_contact_date":{"type":"string","format":"date","nullable":true},"last_contact_date":{"type":"string","format":"date","nullable":true},"next_follow_up_date":{"type":"string","format":"date","nullable":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/ClientPersonMini"}],"readOnly":true},"assigned_to":{"allOf":[{"$ref":"#/components/schemas/ClientPersonMini"}],"readOnly":true},"account_owner":{"allOf":[{"$ref":"#/components/schemas/ClientPersonMini"}],"readOnly":true},"address":{"allOf":[{"$ref":"#/components/schemas/ClientAddress"}],"nullable":true},"banking_information":{"allOf":[{"$ref":"#/components/schemas/ClientBankingInformation"}],"nullable":true},"days_since_last_contact":{"type":"integer","nullable":true,"readOnly":true},"is_follow_up_overdue":{"type":"boolean","readOnly":true},"primary_contact":{"allOf":[{"$ref":"#/components/schemas/ClientContactMini"}],"nullable":true,"readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"last_updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["account_owner","assigned_to","created_by","date_created","days_since_last_contact","entity_type_display","industry_display","is_follow_up_overdue","last_updated","lifecycle_stage_display","name","primary_contact"]},"ClientPersonMini":{"type":"object","description":"Lightweight serializer for Person model.\nUsed for nested person references in other serializers.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","readOnly":true}},"required":["full_name"]},"ClientAddress":{"type":"object","description":"Serializer for Address model.\nCountry field is explicitly defined as CharField to handle django-countries CountryField.","properties":{"address_line_1":{"type":"string","nullable":true,"maxLength":300},"address_line_2":{"type":"string","nullable":true,"maxLength":300},"city":{"type":"string","nullable":true,"maxLength":300},"province_state":{"type":"string","nullable":true,"title":"Province/State","maxLength":300},"postal_code":{"type":"string","nullable":true,"maxLength":300},"country":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true,"title":"Phone Number","pattern":"^\\+?1?\\d{9,15}$","maxLength":17}}},"ClientBankingInformation":{"type":"object","description":"Serializer for BankingInformation model with all banking fields.","properties":{"bank_name":{"type":"string","nullable":true,"maxLength":200},"account_number":{"type":"string","nullable":true,"maxLength":100},"branch_code":{"type":"string","nullable":true,"maxLength":50},"account_type":{"enum":["checking","savings","business","other","",null],"type":"string","description":"* `checking` - Checking\n* `savings` - Savings\n* `business` - Business\n* `other` - Other","nullable":true},"routing_number":{"type":"string","nullable":true,"maxLength":50},"swift_code":{"type":"string","nullable":true,"maxLength":50}}},"ClientContactMini":{"type":"object","description":"Lightweight serializer for Contact model.\nUsed for nested contact references in other serializers.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"first_name":{"type":"string","maxLength":150},"last_name":{"type":"string","maxLength":150},"name":{"type":"string","readOnly":true},"email":{"type":"string","format":"email","nullable":true,"maxLength":254},"phone":{"type":"string","nullable":true,"maxLength":17},"job_title":{"type":"string","readOnly":true,"nullable":true},"primary_contact":{"type":"boolean","description":"Indicates if this is the primary contact for the entity"},"is_active":{"type":"boolean"},"entity_type":{"enum":["client","vendor","lead"],"type":"string","description":"Type of entity this contact belongs to\n\n* `client` - Client\n* `vendor` - Vendor\n* `lead` - Lead"},"entity_id":{"type":"string","nullable":true,"description":"ID of the entity this contact belongs to (optional for potential clients/vendors)","maxLength":100}},"required":["entity_type","first_name","job_title","last_name","name"]}}}}
```

## The ClientAddress object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ClientAddress":{"type":"object","description":"Serializer for Address model.\nCountry field is explicitly defined as CharField to handle django-countries CountryField.","properties":{"address_line_1":{"type":"string","nullable":true,"maxLength":300},"address_line_2":{"type":"string","nullable":true,"maxLength":300},"city":{"type":"string","nullable":true,"maxLength":300},"province_state":{"type":"string","nullable":true,"title":"Province/State","maxLength":300},"postal_code":{"type":"string","nullable":true,"maxLength":300},"country":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true,"title":"Phone Number","pattern":"^\\+?1?\\d{9,15}$","maxLength":17}}}}}}
```

## The ClientAddressRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ClientAddressRequest":{"type":"object","description":"Serializer for Address model.\nCountry field is explicitly defined as CharField to handle django-countries CountryField.","properties":{"address_line_1":{"type":"string","nullable":true,"maxLength":300},"address_line_2":{"type":"string","nullable":true,"maxLength":300},"city":{"type":"string","nullable":true,"maxLength":300},"province_state":{"type":"string","nullable":true,"title":"Province/State","maxLength":300},"postal_code":{"type":"string","nullable":true,"maxLength":300},"country":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true,"title":"Phone Number","pattern":"^\\+?1?\\d{9,15}$","maxLength":17}}}}}}
```

## The ClientBankingInformation object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ClientBankingInformation":{"type":"object","description":"Serializer for BankingInformation model with all banking fields.","properties":{"bank_name":{"type":"string","nullable":true,"maxLength":200},"account_number":{"type":"string","nullable":true,"maxLength":100},"branch_code":{"type":"string","nullable":true,"maxLength":50},"account_type":{"enum":["checking","savings","business","other","",null],"type":"string","description":"* `checking` - Checking\n* `savings` - Savings\n* `business` - Business\n* `other` - Other","nullable":true},"routing_number":{"type":"string","nullable":true,"maxLength":50},"swift_code":{"type":"string","nullable":true,"maxLength":50}}}}}}
```

## The ClientBankingInformationRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ClientBankingInformationRequest":{"type":"object","description":"Serializer for BankingInformation model with all banking fields.","properties":{"bank_name":{"type":"string","nullable":true,"maxLength":200},"account_number":{"type":"string","nullable":true,"maxLength":100},"branch_code":{"type":"string","nullable":true,"maxLength":50},"account_type":{"enum":["checking","savings","business","other","",null],"type":"string","description":"* `checking` - Checking\n* `savings` - Savings\n* `business` - Business\n* `other` - Other","nullable":true},"routing_number":{"type":"string","nullable":true,"maxLength":50},"swift_code":{"type":"string","nullable":true,"maxLength":50}}}}}}
```

## The ClientContactMini object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ClientContactMini":{"type":"object","description":"Lightweight serializer for Contact model.\nUsed for nested contact references in other serializers.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"first_name":{"type":"string","maxLength":150},"last_name":{"type":"string","maxLength":150},"name":{"type":"string","readOnly":true},"email":{"type":"string","format":"email","nullable":true,"maxLength":254},"phone":{"type":"string","nullable":true,"maxLength":17},"job_title":{"type":"string","readOnly":true,"nullable":true},"primary_contact":{"type":"boolean","description":"Indicates if this is the primary contact for the entity"},"is_active":{"type":"boolean"},"entity_type":{"enum":["client","vendor","lead"],"type":"string","description":"Type of entity this contact belongs to\n\n* `client` - Client\n* `vendor` - Vendor\n* `lead` - Lead"},"entity_id":{"type":"string","nullable":true,"description":"ID of the entity this contact belongs to (optional for potential clients/vendors)","maxLength":100}},"required":["entity_type","first_name","job_title","last_name","name"]}}}}
```

## The ClientPersonMini object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ClientPersonMini":{"type":"object","description":"Lightweight serializer for Person model.\nUsed for nested person references in other serializers.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","readOnly":true}},"required":["full_name"]}}}}
```

## The ClientPersonMiniRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ClientPersonMiniRequest":{"type":"object","description":"Lightweight serializer for Person model.\nUsed for nested person references in other serializers.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100}}}}}}
```

## The ClientRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ClientRequest":{"type":"object","description":"Comprehensive serializer for Client model.\nHandles multilingual fields, nested relationships, and computed fields.\nOptimized for list and detail views with optional prefetching support.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","nullable":true},"entity_type":{"enum":["individual","company","non_profit","government","partnership","other"],"type":"string","description":"* `individual` - Individual\n* `company` - Company\n* `non_profit` - Non-Profit Organization\n* `government` - Government Entity\n* `partnership` - Partnership\n* `other` - Other"},"lifecycle_stage":{"enum":["prospect","active_client","matured_client","inactive","dormant","lost_opportunity"],"type":"string","description":"* `prospect` - Prospect\n* `active_client` - Active Client\n* `matured_client` - Matured Client\n* `inactive` - Inactive\n* `dormant` - Dormant\n* `lost_opportunity` - Lost Opportunity","title":"Client Lifecycle Stage"},"industry":{"enum":["agriculture","cleaning","construction","consulting","creative","education","events","handyman","health","home_based","hospitality","it_support","legal","logistics","manufacturing","marketing","music","non_profit","online_retail","photography","printing","professional","travel","utilities","wholesale","writing","virtual_assistance","other","",null],"type":"string","description":"* `agriculture` - Agriculture and Farming\n* `cleaning` - Cleaning Services\n* `construction` - Construction and Real Estate Services\n* `consulting` - Consulting and Freelancing\n* `creative` - Creative and Design Services\n* `education` - Education and Tutoring Services\n* `events` - Entertainment and Events Planning\n* `handyman` - Handyman and Home Repair Services\n* `health` - Health and Wellness\n* `home_based` - Home-Based Businesses\n* `hospitality` - Hospitality and Tourism\n* `it_support` - IT and Software Support Services\n* `legal` - Legal and Financial Services\n* `logistics` - Logistics and Delivery Services\n* `manufacturing` - Manufacturing and Small-Scale Production\n* `marketing` - Marketing and Advertising Services\n* `music` - Music and Entertainment Services\n* `non_profit` - Non-Profit and Social Enterprises\n* `online_retail` - Online Retail and E-commerce\n* `photography` - Photography and Videography Services\n* `printing` - Printing and Copy Services\n* `professional` - Professional Services\n* `travel` - Travel Agencies\n* `utilities` - Utilities and Renewable Energy Services\n* `wholesale` - Wholesale and Distribution\n* `writing` - Writing and Editing Services\n* `virtual_assistance` - Virtual Assistance and Admin Support\n* `other` - Other","nullable":true},"website":{"type":"string","format":"uri","nullable":true,"maxLength":300},"company_size":{"type":"string","nullable":true,"maxLength":100},"annual_revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Annual revenue in USD"},"default_currency":{"type":"string","minLength":1,"description":"Default currency code (ISO 4217) for this entity's transactions","maxLength":3},"first_contact_date":{"type":"string","format":"date","nullable":true},"last_contact_date":{"type":"string","format":"date","nullable":true},"next_follow_up_date":{"type":"string","format":"date","nullable":true},"address":{"allOf":[{"$ref":"#/components/schemas/ClientAddressRequest"}],"nullable":true},"banking_information":{"allOf":[{"$ref":"#/components/schemas/ClientBankingInformationRequest"}],"nullable":true}},"required":["name"]},"ClientAddressRequest":{"type":"object","description":"Serializer for Address model.\nCountry field is explicitly defined as CharField to handle django-countries CountryField.","properties":{"address_line_1":{"type":"string","nullable":true,"maxLength":300},"address_line_2":{"type":"string","nullable":true,"maxLength":300},"city":{"type":"string","nullable":true,"maxLength":300},"province_state":{"type":"string","nullable":true,"title":"Province/State","maxLength":300},"postal_code":{"type":"string","nullable":true,"maxLength":300},"country":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true,"title":"Phone Number","pattern":"^\\+?1?\\d{9,15}$","maxLength":17}}},"ClientBankingInformationRequest":{"type":"object","description":"Serializer for BankingInformation model with all banking fields.","properties":{"bank_name":{"type":"string","nullable":true,"maxLength":200},"account_number":{"type":"string","nullable":true,"maxLength":100},"branch_code":{"type":"string","nullable":true,"maxLength":50},"account_type":{"enum":["checking","savings","business","other","",null],"type":"string","description":"* `checking` - Checking\n* `savings` - Savings\n* `business` - Business\n* `other` - Other","nullable":true},"routing_number":{"type":"string","nullable":true,"maxLength":50},"swift_code":{"type":"string","nullable":true,"maxLength":50}}}}}}
```

## The Contact object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"Contact":{"type":"object","description":"Comprehensive serializer for Contact model.\nHandles contact creation, updates, and group assignment.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"translations":{"type":"string"},"organisation_name":{"type":"string","readOnly":true},"created_by_name":{"type":"string","nullable":true,"readOnly":true},"contact_group":{"type":"string","nullable":true,"description":"Contact group unique_id (optional - can be assigned later)"},"contact_group_id":{"type":"string","readOnly":true},"contact_group_name":{"type":"string","nullable":true,"readOnly":true},"entity_type":{"enum":["client","vendor","lead"],"type":"string","description":"Type of entity (client, vendor, lead)\n\n* `client` - Client\n* `vendor` - Vendor\n* `lead` - Lead"},"entity_type_display":{"type":"string","readOnly":true},"entity_id":{"type":"string","nullable":true,"description":"ID of the entity this contact belongs to (optional for potential clients/vendors)","maxLength":100},"first_name":{"type":"string","maxLength":150},"last_name":{"type":"string","maxLength":150},"full_name":{"type":"string","nullable":true,"readOnly":true},"email":{"type":"string","format":"email","nullable":true,"maxLength":254},"phone":{"type":"string","nullable":true,"maxLength":17},"mobile":{"type":"string","nullable":true,"maxLength":17},"linkedin_url":{"type":"string","format":"uri","nullable":true,"description":"LinkedIn profile URL","maxLength":200},"job_title":{"type":"string","nullable":true},"department":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"is_active":{"type":"boolean"},"primary_contact":{"type":"boolean","description":"Indicates if this is the primary contact for the entity"},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["contact_group_id","contact_group_name","created_by_name","entity_type","entity_type_display","first_name","full_name","last_name","organisation_name","translations"]}}}}
```

## The ContactGroup object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ContactGroup":{"type":"object","description":"Serializer for ContactGroup model supporting both creation and listing.\nHandles multilingual fields through parler TranslatableModelSerializer.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","maxLength":200},"description":{"type":"string","nullable":true},"translations":{"type":"string"},"is_active":{"type":"boolean"},"created_by_name":{"type":"string","nullable":true,"readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["created_by_name","name","translations"]}}}}
```

## The ContactGroupDetail object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ContactGroupDetail":{"type":"object","description":"Serializer for ContactGroup model with minimal nested information for performance.\nHandles multilingual fields through parler TranslatableModelSerializer.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"translations":{"type":"string"},"organisation_name":{"type":"string","readOnly":true},"created_by_name":{"type":"string","nullable":true,"readOnly":true},"is_active":{"type":"boolean"},"contacts_count":{"type":"integer","readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["contacts_count","created_by_name","organisation_name","translations"]}}}}
```

## The ContactGroupRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ContactGroupRequest":{"type":"object","description":"Serializer for ContactGroup model supporting both creation and listing.\nHandles multilingual fields through parler TranslatableModelSerializer.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","nullable":true},"translations":{"type":"string"},"is_active":{"type":"boolean"},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["name","translations"]}}}}
```

## The ContactRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ContactRequest":{"type":"object","description":"Comprehensive serializer for Contact model.\nHandles contact creation, updates, and group assignment.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"translations":{"type":"string"},"contact_group":{"type":"string","nullable":true,"description":"Contact group unique_id (optional - can be assigned later)"},"entity_type":{"enum":["client","vendor","lead"],"type":"string","description":"Type of entity (client, vendor, lead)\n\n* `client` - Client\n* `vendor` - Vendor\n* `lead` - Lead"},"entity_id":{"type":"string","nullable":true,"description":"ID of the entity this contact belongs to (optional for potential clients/vendors)","maxLength":100},"first_name":{"type":"string","minLength":1,"maxLength":150},"last_name":{"type":"string","minLength":1,"maxLength":150},"email":{"type":"string","format":"email","nullable":true,"maxLength":254},"phone":{"type":"string","nullable":true,"maxLength":17},"mobile":{"type":"string","nullable":true,"maxLength":17},"linkedin_url":{"type":"string","format":"uri","nullable":true,"description":"LinkedIn profile URL","maxLength":200},"job_title":{"type":"string","nullable":true},"department":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"is_active":{"type":"boolean"},"primary_contact":{"type":"boolean","description":"Indicates if this is the primary contact for the entity"},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["entity_type","first_name","last_name","translations"]}}}}
```

## The EmployeeInformation object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"EmployeeInformation":{"type":"object","description":"Serializer for EmployeeInformation with complete employee data.","properties":{"id_number":{"type":"string","nullable":true,"maxLength":100},"employee_number":{"type":"string","nullable":true,"maxLength":100},"tax_number":{"type":"string","nullable":true,"maxLength":100},"phone_number":{"type":"string","nullable":true,"maxLength":200},"birthday":{"type":"string","format":"date","nullable":true},"linkedin_url":{"type":"string","format":"uri","nullable":true,"title":"LinkedIn Profile","maxLength":300},"emergency_contact":{"type":"string","nullable":true,"maxLength":300},"emergency_phone":{"type":"string","nullable":true,"maxLength":200},"medical_aid_number":{"type":"string","nullable":true,"maxLength":300},"medical_aid_provider":{"type":"string","nullable":true,"maxLength":300},"medical_aid_plan":{"type":"string","nullable":true,"maxLength":300},"medical_conditions":{"type":"string","nullable":true},"allergies":{"type":"string","nullable":true},"medications":{"type":"string","nullable":true},"start_date":{"type":"string","format":"date","nullable":true},"end_date":{"type":"string","format":"date","nullable":true},"is_active_employee":{"type":"boolean"},"date_created":{"type":"string","format":"date-time","readOnly":true},"last_updated":{"type":"string","format":"date-time","readOnly":true}},"required":["date_created","last_updated"]}}}}
```

## The EmployeeInformationRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"EmployeeInformationRequest":{"type":"object","description":"Serializer for EmployeeInformation with complete employee data.","properties":{"id_number":{"type":"string","nullable":true,"maxLength":100},"employee_number":{"type":"string","nullable":true,"maxLength":100},"tax_number":{"type":"string","nullable":true,"maxLength":100},"phone_number":{"type":"string","nullable":true,"maxLength":200},"birthday":{"type":"string","format":"date","nullable":true},"linkedin_url":{"type":"string","format":"uri","nullable":true,"title":"LinkedIn Profile","maxLength":300},"emergency_contact":{"type":"string","nullable":true,"maxLength":300},"emergency_phone":{"type":"string","nullable":true,"maxLength":200},"medical_aid_number":{"type":"string","nullable":true,"maxLength":300},"medical_aid_provider":{"type":"string","nullable":true,"maxLength":300},"medical_aid_plan":{"type":"string","nullable":true,"maxLength":300},"medical_conditions":{"type":"string","nullable":true},"allergies":{"type":"string","nullable":true},"medications":{"type":"string","nullable":true},"start_date":{"type":"string","format":"date","nullable":true},"end_date":{"type":"string","format":"date","nullable":true},"is_active_employee":{"type":"boolean"}}}}}}
```

## The Expense object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"Expense":{"type":"object","description":"Comprehensive serializer for Expense model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string"},"description":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"expense_number":{"type":"string","maxLength":100},"account":{"allOf":[{"$ref":"#/components/schemas/AccountParent"}],"readOnly":true},"status":{"enum":["draft","submitted","approved","paid","rejected","reimbursed"],"type":"string","description":"* `draft` - Draft\n* `submitted` - Submitted for Approval\n* `approved` - Approved\n* `paid` - Paid\n* `rejected` - Rejected\n* `reimbursed` - Reimbursed"},"status_display":{"type":"string","readOnly":true},"expense_date":{"type":"string","format":"date"},"submitted_date":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"approved_date":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"paid_date":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"tax_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"vendor":{"allOf":[{"$ref":"#/components/schemas/FinanceExpenseVendorMini"}],"readOnly":true},"employee":{"allOf":[{"$ref":"#/components/schemas/FinancePersonMini"}],"readOnly":true},"approved_by":{"allOf":[{"$ref":"#/components/schemas/FinancePersonMini"}],"readOnly":true},"receipt":{"type":"string","format":"uri","nullable":true,"description":"Receipt or supporting document"},"receipt_url":{"type":"string","nullable":true,"readOnly":true},"vat_processed":{"type":"boolean","description":"Whether VAT has been processed for reconciliation"},"vat_processed_date":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/FinancePersonMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"last_updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["account","amount","approved_by","approved_date","created_by","date_created","employee","expense_date","expense_number","last_updated","paid_date","receipt_url","status_display","submitted_date","title","total_amount","vat_processed_date","vendor"]},"AccountParent":{"type":"object","description":"Minimal serializer for parent account references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"account_code":{"type":"string","maxLength":20},"name":{"type":"string","readOnly":true},"account_type":{"enum":["asset","liability","equity","income","expense"],"type":"string","description":"* `asset` - Asset\n* `liability` - Liability\n* `equity` - Equity\n* `income` - Income\n* `expense` - Expense"}},"required":["account_code","account_type","name"]},"FinanceExpenseVendorMini":{"type":"object","description":"Lightweight serializer for Vendor references.","properties":{"unique_id":{"type":"string"},"name":{"type":"string","readOnly":true}},"required":["name","unique_id"]},"FinancePersonMini":{"type":"object","description":"Lightweight serializer for Person model.\nUsed for nested person references in financial documents.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","readOnly":true}},"required":["full_name"]}}}}
```

## The ExpenseList object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ExpenseList":{"type":"object","description":"Lightweight version for list views.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string"},"expense_number":{"type":"string","maxLength":100},"status":{"enum":["draft","submitted","approved","paid","rejected","reimbursed"],"type":"string","description":"* `draft` - Draft\n* `submitted` - Submitted for Approval\n* `approved` - Approved\n* `paid` - Paid\n* `rejected` - Rejected\n* `reimbursed` - Reimbursed"},"status_display":{"type":"string","readOnly":true},"expense_date":{"type":"string","format":"date"},"amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"tax_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"employee":{"allOf":[{"$ref":"#/components/schemas/FinancePersonMini"}],"readOnly":true},"vendor":{"allOf":[{"$ref":"#/components/schemas/FinanceExpenseVendorMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["amount","date_created","employee","expense_date","expense_number","status_display","title","total_amount","vendor"]},"FinancePersonMini":{"type":"object","description":"Lightweight serializer for Person model.\nUsed for nested person references in financial documents.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","readOnly":true}},"required":["full_name"]},"FinanceExpenseVendorMini":{"type":"object","description":"Lightweight serializer for Vendor references.","properties":{"unique_id":{"type":"string"},"name":{"type":"string","readOnly":true}},"required":["name","unique_id"]}}}}
```

## The ExpenseRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ExpenseRequest":{"type":"object","description":"Comprehensive serializer for Expense model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string","minLength":1},"description":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"expense_number":{"type":"string","minLength":1,"maxLength":100},"account_id":{"type":"string","writeOnly":true,"minLength":1},"status":{"enum":["draft","submitted","approved","paid","rejected","reimbursed"],"type":"string","description":"* `draft` - Draft\n* `submitted` - Submitted for Approval\n* `approved` - Approved\n* `paid` - Paid\n* `rejected` - Rejected\n* `reimbursed` - Reimbursed"},"expense_date":{"type":"string","format":"date"},"amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"tax_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"vendor_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"employee_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"receipt":{"type":"string","format":"binary","nullable":true,"description":"Receipt or supporting document"},"vat_processed":{"type":"boolean","description":"Whether VAT has been processed for reconciliation"}},"required":["account_id","amount","expense_date","expense_number","title"]}}}}
```

## The FinanceClientMini object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"FinanceClientMini":{"type":"object","description":"Lightweight serializer for Client model.\nUsed for nested client references in invoices and quotes.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"entity_type":{"enum":["individual","company","non_profit","government","partnership","other"],"type":"string","description":"* `individual` - Individual\n* `company` - Company\n* `non_profit` - Non-Profit Organization\n* `government` - Government Entity\n* `partnership` - Partnership\n* `other` - Other"}},"required":["name"]}}}}
```

## The FinanceClientMiniRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"FinanceClientMiniRequest":{"type":"object","description":"Lightweight serializer for Client model.\nUsed for nested client references in invoices and quotes.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"entity_type":{"enum":["individual","company","non_profit","government","partnership","other"],"type":"string","description":"* `individual` - Individual\n* `company` - Company\n* `non_profit` - Non-Profit Organization\n* `government` - Government Entity\n* `partnership` - Partnership\n* `other` - Other"}}}}}}
```

## The FinanceExpenseVendorMini object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"FinanceExpenseVendorMini":{"type":"object","description":"Lightweight serializer for Vendor references.","properties":{"unique_id":{"type":"string"},"name":{"type":"string","readOnly":true}},"required":["name","unique_id"]}}}}
```

## The FinanceExpenseVendorMiniRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"FinanceExpenseVendorMiniRequest":{"type":"object","description":"Lightweight serializer for Vendor references.","properties":{"unique_id":{"type":"string","minLength":1}},"required":["unique_id"]}}}}
```

## The FinancePersonMini object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"FinancePersonMini":{"type":"object","description":"Lightweight serializer for Person model.\nUsed for nested person references in financial documents.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","readOnly":true}},"required":["full_name"]}}}}
```

## The FinancePersonMiniRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"FinancePersonMiniRequest":{"type":"object","description":"Lightweight serializer for Person model.\nUsed for nested person references in financial documents.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100}}}}}}
```

## The Invoice object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"Invoice":{"type":"object","description":"Comprehensive serializer for Invoice model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string"},"description":{"type":"string","nullable":true},"invoice_number":{"type":"string","maxLength":100},"status":{"enum":["draft","sent","viewed","paid","partially_paid","overdue","cancelled","refunded"],"type":"string","description":"* `draft` - Draft\n* `sent` - Sent\n* `viewed` - Viewed by Client\n* `paid` - Paid\n* `partially_paid` - Partially Paid\n* `overdue` - Overdue\n* `cancelled` - Cancelled\n* `refunded` - Refunded"},"status_display":{"type":"string","readOnly":true},"invoice_date":{"type":"string","format":"date","nullable":true},"due_date":{"type":"string","format":"date"},"subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Calculated from line items"},"total_tax_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Total VAT/tax from all line items"},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Subtotal + Total Tax Amount"},"paid_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"remaining_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true},"is_overdue":{"type":"boolean","readOnly":true},"currency":{"type":"string","readOnly":true},"client":{"allOf":[{"$ref":"#/components/schemas/FinanceClientMini"}],"readOnly":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/InvoiceItem"}},"created_by":{"allOf":[{"$ref":"#/components/schemas/FinancePersonMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"last_updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["client","created_by","currency","date_created","due_date","invoice_number","is_overdue","last_updated","remaining_amount","status_display","subtotal","title","total_amount","total_tax_amount"]},"FinanceClientMini":{"type":"object","description":"Lightweight serializer for Client model.\nUsed for nested client references in invoices and quotes.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"entity_type":{"enum":["individual","company","non_profit","government","partnership","other"],"type":"string","description":"* `individual` - Individual\n* `company` - Company\n* `non_profit` - Non-Profit Organization\n* `government` - Government Entity\n* `partnership` - Partnership\n* `other` - Other"}},"required":["name"]},"InvoiceItem":{"type":"object","description":"Serializer for invoice line items.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"item_name":{"type":"string","readOnly":true},"quantity":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"discount_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Discount %"},"vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"VAT Rate (%)","description":"VAT/tax rate percentage for this line item"},"currency":{"type":"string","description":"Currency code (ISO 4217) for this line item","maxLength":3},"line_subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_vat_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_total":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true}},"required":["item_name","line_subtotal","line_total","line_vat_amount","quantity","unit_price"]},"FinancePersonMini":{"type":"object","description":"Lightweight serializer for Person model.\nUsed for nested person references in financial documents.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","readOnly":true}},"required":["full_name"]}}}}
```

## The InvoiceItem object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"InvoiceItem":{"type":"object","description":"Serializer for invoice line items.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"item_name":{"type":"string","readOnly":true},"quantity":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"discount_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Discount %"},"vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"VAT Rate (%)","description":"VAT/tax rate percentage for this line item"},"currency":{"type":"string","description":"Currency code (ISO 4217) for this line item","maxLength":3},"line_subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_vat_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_total":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true}},"required":["item_name","line_subtotal","line_total","line_vat_amount","quantity","unit_price"]}}}}
```

## The InvoiceItemRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"InvoiceItemRequest":{"type":"object","description":"Serializer for invoice line items.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"product_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"service_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"quantity":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"discount_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Discount %"},"vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"VAT Rate (%)","description":"VAT/tax rate percentage for this line item"},"currency":{"type":"string","minLength":1,"description":"Currency code (ISO 4217) for this line item","maxLength":3}},"required":["quantity","unit_price"]}}}}
```

## The InvoiceList object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"InvoiceList":{"type":"object","description":"Lightweight version for list views.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string"},"invoice_number":{"type":"string","maxLength":100},"status":{"enum":["draft","sent","viewed","paid","partially_paid","overdue","cancelled","refunded"],"type":"string","description":"* `draft` - Draft\n* `sent` - Sent\n* `viewed` - Viewed by Client\n* `paid` - Paid\n* `partially_paid` - Partially Paid\n* `overdue` - Overdue\n* `cancelled` - Cancelled\n* `refunded` - Refunded"},"status_display":{"type":"string","readOnly":true},"invoice_date":{"type":"string","format":"date","nullable":true},"due_date":{"type":"string","format":"date"},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Subtotal + Total Tax Amount"},"paid_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"remaining_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true},"is_overdue":{"type":"boolean","readOnly":true},"currency":{"type":"string","readOnly":true},"client":{"allOf":[{"$ref":"#/components/schemas/FinanceClientMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["client","currency","date_created","due_date","invoice_number","is_overdue","remaining_amount","status_display","title","total_amount"]},"FinanceClientMini":{"type":"object","description":"Lightweight serializer for Client model.\nUsed for nested client references in invoices and quotes.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"entity_type":{"enum":["individual","company","non_profit","government","partnership","other"],"type":"string","description":"* `individual` - Individual\n* `company` - Company\n* `non_profit` - Non-Profit Organization\n* `government` - Government Entity\n* `partnership` - Partnership\n* `other` - Other"}},"required":["name"]}}}}
```

## The InvoiceRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"InvoiceRequest":{"type":"object","description":"Comprehensive serializer for Invoice model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string","minLength":1},"description":{"type":"string","nullable":true},"invoice_number":{"type":"string","minLength":1,"maxLength":100},"status":{"enum":["draft","sent","viewed","paid","partially_paid","overdue","cancelled","refunded"],"type":"string","description":"* `draft` - Draft\n* `sent` - Sent\n* `viewed` - Viewed by Client\n* `paid` - Paid\n* `partially_paid` - Partially Paid\n* `overdue` - Overdue\n* `cancelled` - Cancelled\n* `refunded` - Refunded"},"invoice_date":{"type":"string","format":"date","nullable":true},"due_date":{"type":"string","format":"date"},"paid_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"client_id":{"type":"string","writeOnly":true,"minLength":1,"description":"Client unique_id (required)"},"items":{"type":"array","items":{"$ref":"#/components/schemas/InvoiceItemRequest"}}},"required":["client_id","due_date","invoice_number","title"]},"InvoiceItemRequest":{"type":"object","description":"Serializer for invoice line items.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"product_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"service_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"quantity":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"discount_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Discount %"},"vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"VAT Rate (%)","description":"VAT/tax rate percentage for this line item"},"currency":{"type":"string","minLength":1,"description":"Currency code (ISO 4217) for this line item","maxLength":3}},"required":["quantity","unit_price"]}}}}
```

## The Lead object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"Lead":{"type":"object","description":"Comprehensive serializer for Lead model.\nHandles multilingual fields, sales stage relationships, and computed metrics like weighted value.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string"},"description":{"type":"string","nullable":true},"qualification_notes":{"type":"string","nullable":true},"priority":{"enum":["low","medium","high","critical"],"type":"string","description":"* `low` - Low\n* `medium` - Medium\n* `high` - High\n* `critical` - Critical"},"lead_source":{"enum":["website","social_media","email_marketing","referral","cold_calling","trade_show","advertising","content_marketing","seo","ppc","partner","other"],"type":"string","description":"Select one of the predefined lead sources.\n\n* `website` - Website\n* `social_media` - Social Media\n* `email_marketing` - Email Marketing\n* `referral` - Referral\n* `cold_calling` - Cold Calling\n* `trade_show` - Trade Show\n* `advertising` - Advertising\n* `content_marketing` - Content Marketing\n* `seo` - SEO\n* `ppc` - Pay-per-Click\n* `partner` - Partner\n* `other` - Other"},"estimated_value":{"type":"string","format":"decimal","pattern":"^-?\\d{0,16}(?:\\.\\d{0,2})?$","nullable":true},"win_probability":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","nullable":true},"weighted_value":{"type":"string","format":"decimal","pattern":"^-?\\d{0,16}(?:\\.\\d{0,2})?$","nullable":true,"readOnly":true},"sales_stage":{"type":"string","nullable":true,"description":"Unique ID of an existing sales stage."},"client":{"type":"string","nullable":true,"description":"Unique ID of an existing client."},"expected_close_date":{"type":"string","format":"date","nullable":true},"follow_up_date":{"type":"string","format":"date-time","nullable":true,"title":"Next Follow Up Date"},"created_by":{"allOf":[{"$ref":"#/components/schemas/ClientPersonMini"}],"readOnly":true},"assigned_to":{"allOf":[{"$ref":"#/components/schemas/ClientPersonMini"}],"readOnly":true},"is_closed":{"type":"boolean","readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true},"last_updated":{"type":"string","format":"date-time","readOnly":true}},"required":["assigned_to","created_by","date_created","is_closed","last_updated","lead_source","sales_stage","title","weighted_value"]},"ClientPersonMini":{"type":"object","description":"Lightweight serializer for Person model.\nUsed for nested person references in other serializers.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","readOnly":true}},"required":["full_name"]}}}}
```

## The LeadRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"LeadRequest":{"type":"object","description":"Comprehensive serializer for Lead model.\nHandles multilingual fields, sales stage relationships, and computed metrics like weighted value.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string","minLength":1},"description":{"type":"string","nullable":true},"qualification_notes":{"type":"string","nullable":true},"priority":{"enum":["low","medium","high","critical"],"type":"string","description":"* `low` - Low\n* `medium` - Medium\n* `high` - High\n* `critical` - Critical"},"lead_source":{"enum":["website","social_media","email_marketing","referral","cold_calling","trade_show","advertising","content_marketing","seo","ppc","partner","other"],"type":"string","description":"Select one of the predefined lead sources.\n\n* `website` - Website\n* `social_media` - Social Media\n* `email_marketing` - Email Marketing\n* `referral` - Referral\n* `cold_calling` - Cold Calling\n* `trade_show` - Trade Show\n* `advertising` - Advertising\n* `content_marketing` - Content Marketing\n* `seo` - SEO\n* `ppc` - Pay-per-Click\n* `partner` - Partner\n* `other` - Other"},"estimated_value":{"type":"string","format":"decimal","pattern":"^-?\\d{0,16}(?:\\.\\d{0,2})?$","nullable":true},"win_probability":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","nullable":true},"sales_stage":{"type":"string","nullable":true,"description":"Unique ID of an existing sales stage."},"client":{"type":"string","nullable":true,"description":"Unique ID of an existing client."},"expected_close_date":{"type":"string","format":"date","nullable":true},"follow_up_date":{"type":"string","format":"date-time","nullable":true,"title":"Next Follow Up Date"}},"required":["lead_source","sales_stage","title"]}}}}
```

## The LiabilityDetail object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"LiabilityDetail":{"type":"object","description":"Detailed serializer for single liability retrieval.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true},"liability_code":{"type":"string","nullable":true,"maxLength":100},"reference_number":{"type":"string","nullable":true,"maxLength":200},"liability_type":{"enum":["accounts_payable","notes_payable","loans_payable","mortgage_payable","bonds_payable","accrued_expenses","deferred_revenue","tax_payable","salary_payable","interest_payable","rent_payable","utilities_payable","lease_obligations","warranty_obligations","legal_obligations","other"],"type":"string","description":"* `accounts_payable` - Accounts Payable\n* `notes_payable` - Notes Payable\n* `loans_payable` - Loans Payable\n* `mortgage_payable` - Mortgage Payable\n* `bonds_payable` - Bonds Payable\n* `accrued_expenses` - Accrued Expenses\n* `deferred_revenue` - Deferred Revenue\n* `tax_payable` - Tax Payable\n* `salary_payable` - Salary/Wages Payable\n* `interest_payable` - Interest Payable\n* `rent_payable` - Rent Payable\n* `utilities_payable` - Utilities Payable\n* `lease_obligations` - Lease Obligations\n* `warranty_obligations` - Warranty Obligations\n* `legal_obligations` - Legal Obligations\n* `other` - Other"},"classification":{"enum":["current","non_current","contingent"],"type":"string","description":"* `current` - Current Liability\n* `non_current` - Non-Current Liability\n* `contingent` - Contingent Liability"},"original_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","description":"Original liability amount"},"current_balance":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","description":"Current outstanding balance"},"remaining_balance":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true},"paid_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","description":"Total amount paid so far"},"interest_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","nullable":true,"title":"Interest Rate (%)","description":"Annual interest rate percentage"},"liability_date":{"type":"string","format":"date","description":"Date when liability was incurred"},"due_date":{"type":"string","format":"date","nullable":true},"payment_date":{"type":"string","format":"date","nullable":true},"maturity_date":{"type":"string","format":"date","nullable":true},"status":{"enum":["pending","overdue","paid","partially_paid","disputed","cancelled","deferred"],"type":"string","description":"* `pending` - Pending\n* `overdue` - Overdue\n* `paid` - Paid\n* `partially_paid` - Partially Paid\n* `disputed` - Disputed\n* `cancelled` - Cancelled\n* `deferred` - Deferred"},"priority":{"enum":["low","medium","high","critical"],"type":"string","description":"* `low` - Low\n* `medium` - Medium\n* `high` - High\n* `critical` - Critical"},"creditor_name":{"type":"string","nullable":true,"title":"Creditor/Vendor Name","maxLength":300},"creditor_contact":{"type":"string","nullable":true,"maxLength":200},"creditor_email":{"type":"string","format":"email","nullable":true,"maxLength":254},"creditor_phone":{"type":"string","nullable":true,"maxLength":50},"payment_terms":{"type":"string","nullable":true,"maxLength":200},"late_fee_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","nullable":true,"title":"Late Fee Rate (%)","description":"Late payment fee percentage"},"category":{"type":"string","nullable":true,"maxLength":200},"department":{"type":"string","nullable":true,"maxLength":200},"project_reference":{"type":"string","nullable":true,"maxLength":200},"supporting_document_url":{"type":"string","format":"uri","nullable":true,"readOnly":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/LiabilityPersonMini"}],"readOnly":true},"is_overdue":{"type":"boolean","readOnly":true},"days_until_due":{"type":"integer","nullable":true,"readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["created_by","current_balance","days_until_due","description","is_overdue","liability_date","name","original_amount","remaining_balance","supporting_document_url"]},"LiabilityPersonMini":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","nullable":true,"readOnly":true}},"required":["full_name"]}}}}
```

## The LiabilityList object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"LiabilityList":{"type":"object","description":"Lightweight serializer for liability lists.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"liability_code":{"type":"string","nullable":true,"maxLength":100},"reference_number":{"type":"string","nullable":true,"maxLength":200},"liability_type":{"enum":["accounts_payable","notes_payable","loans_payable","mortgage_payable","bonds_payable","accrued_expenses","deferred_revenue","tax_payable","salary_payable","interest_payable","rent_payable","utilities_payable","lease_obligations","warranty_obligations","legal_obligations","other"],"type":"string","description":"* `accounts_payable` - Accounts Payable\n* `notes_payable` - Notes Payable\n* `loans_payable` - Loans Payable\n* `mortgage_payable` - Mortgage Payable\n* `bonds_payable` - Bonds Payable\n* `accrued_expenses` - Accrued Expenses\n* `deferred_revenue` - Deferred Revenue\n* `tax_payable` - Tax Payable\n* `salary_payable` - Salary/Wages Payable\n* `interest_payable` - Interest Payable\n* `rent_payable` - Rent Payable\n* `utilities_payable` - Utilities Payable\n* `lease_obligations` - Lease Obligations\n* `warranty_obligations` - Warranty Obligations\n* `legal_obligations` - Legal Obligations\n* `other` - Other"},"classification":{"enum":["current","non_current","contingent"],"type":"string","description":"* `current` - Current Liability\n* `non_current` - Non-Current Liability\n* `contingent` - Contingent Liability"},"original_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","description":"Original liability amount"},"current_balance":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","description":"Current outstanding balance"},"remaining_balance":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true},"paid_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","description":"Total amount paid so far"},"liability_date":{"type":"string","format":"date","description":"Date when liability was incurred"},"due_date":{"type":"string","format":"date","nullable":true},"status":{"enum":["pending","overdue","paid","partially_paid","disputed","cancelled","deferred"],"type":"string","description":"* `pending` - Pending\n* `overdue` - Overdue\n* `paid` - Paid\n* `partially_paid` - Partially Paid\n* `disputed` - Disputed\n* `cancelled` - Cancelled\n* `deferred` - Deferred"},"priority":{"enum":["low","medium","high","critical"],"type":"string","description":"* `low` - Low\n* `medium` - Medium\n* `high` - High\n* `critical` - Critical"},"creditor_name":{"type":"string","nullable":true,"title":"Creditor/Vendor Name","maxLength":300},"is_overdue":{"type":"boolean","readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true}},"required":["current_balance","is_overdue","liability_date","name","original_amount","remaining_balance"]}}}}
```

## The LiabilityPersonMini object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"LiabilityPersonMini":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","nullable":true,"readOnly":true}},"required":["full_name"]}}}}
```

## The LiabilityPersonMiniRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"LiabilityPersonMiniRequest":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100}}}}}}
```

## The LiabilityRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"LiabilityRequest":{"type":"object","description":"Full serializer for Liability creation and updates.\nHandles translatable fields correctly.","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","nullable":true},"liability_code":{"type":"string","nullable":true,"maxLength":100},"reference_number":{"type":"string","nullable":true,"maxLength":200},"liability_type":{"enum":["accounts_payable","notes_payable","loans_payable","mortgage_payable","bonds_payable","accrued_expenses","deferred_revenue","tax_payable","salary_payable","interest_payable","rent_payable","utilities_payable","lease_obligations","warranty_obligations","legal_obligations","other"],"type":"string","description":"* `accounts_payable` - Accounts Payable\n* `notes_payable` - Notes Payable\n* `loans_payable` - Loans Payable\n* `mortgage_payable` - Mortgage Payable\n* `bonds_payable` - Bonds Payable\n* `accrued_expenses` - Accrued Expenses\n* `deferred_revenue` - Deferred Revenue\n* `tax_payable` - Tax Payable\n* `salary_payable` - Salary/Wages Payable\n* `interest_payable` - Interest Payable\n* `rent_payable` - Rent Payable\n* `utilities_payable` - Utilities Payable\n* `lease_obligations` - Lease Obligations\n* `warranty_obligations` - Warranty Obligations\n* `legal_obligations` - Legal Obligations\n* `other` - Other"},"classification":{"enum":["current","non_current","contingent"],"type":"string","description":"* `current` - Current Liability\n* `non_current` - Non-Current Liability\n* `contingent` - Contingent Liability"},"original_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","description":"Original amount is required and must be non-negative."},"current_balance":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","description":"Current outstanding balance"},"paid_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","description":"Total amount paid so far"},"interest_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","nullable":true,"title":"Interest Rate (%)","description":"Annual interest rate percentage"},"liability_date":{"type":"string","format":"date","description":"Liability date is required."},"due_date":{"type":"string","format":"date","nullable":true},"payment_date":{"type":"string","format":"date","nullable":true},"maturity_date":{"type":"string","format":"date","nullable":true},"status":{"enum":["pending","overdue","paid","partially_paid","disputed","cancelled","deferred"],"type":"string","description":"* `pending` - Pending\n* `overdue` - Overdue\n* `paid` - Paid\n* `partially_paid` - Partially Paid\n* `disputed` - Disputed\n* `cancelled` - Cancelled\n* `deferred` - Deferred"},"priority":{"enum":["low","medium","high","critical"],"type":"string","description":"* `low` - Low\n* `medium` - Medium\n* `high` - High\n* `critical` - Critical"},"creditor_name":{"type":"string","nullable":true,"title":"Creditor/Vendor Name","maxLength":300},"creditor_contact":{"type":"string","nullable":true,"maxLength":200},"creditor_email":{"type":"string","format":"email","nullable":true,"maxLength":254},"creditor_phone":{"type":"string","nullable":true,"maxLength":50},"payment_terms":{"type":"string","nullable":true,"maxLength":200},"late_fee_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","nullable":true,"title":"Late Fee Rate (%)","description":"Late payment fee percentage"},"category":{"type":"string","nullable":true,"maxLength":200},"department":{"type":"string","nullable":true,"maxLength":200},"project_reference":{"type":"string","nullable":true,"maxLength":200},"supporting_document":{"type":"string","format":"binary","nullable":true,"description":"Upload contract, invoice, or agreement document (PDF, DOC, DOCX, JPG, PNG)"}},"required":["current_balance","liability_date","name","original_amount"]}}}}
```

## The OrganisationBasic object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"OrganisationBasic":{"type":"object","description":"Basic serializer for Organisation – limited information for regular members.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"language":{"enum":["en","sw","de","es","hi","ar","ko","pt","af","el","fr","ta","ru","zh-hans","",null],"type":"string","description":"* `en` - English\n* `sw` - Swahili\n* `de` - German\n* `es` - Spanish\n* `hi` - Hindi\n* `ar` - Arabic\n* `ko` - Korean\n* `pt` - Portuguese\n* `af` - Afrikaans\n* `el` - Greek\n* `fr` - French\n* `ta` - Tamil\n* `ru` - Russian\n* `zh-hans` - Simplified Chinese","nullable":true},"language_display":{"type":"string","readOnly":true},"business_description":{"type":"string","readOnly":true,"nullable":true},"business_category":{"enum":["agriculture","cleaning","construction","consulting","creative","education","events","handyman","health","home_based","hospitality","it_support","legal","logistics","manufacturing","marketing","music","non_profit","online_retail","photography","printing","professional","travel","utilities","wholesale","writing","virtual_assistance","other","",null],"type":"string","description":"* `agriculture` - Agriculture and Farming\n* `cleaning` - Cleaning Services\n* `construction` - Construction and Real Estate Services\n* `consulting` - Consulting and Freelancing\n* `creative` - Creative and Design Services\n* `education` - Education and Tutoring Services\n* `events` - Entertainment and Events Planning\n* `handyman` - Handyman and Home Repair Services\n* `health` - Health and Wellness\n* `home_based` - Home-Based Businesses\n* `hospitality` - Hospitality and Tourism\n* `it_support` - IT and Software Support Services\n* `legal` - Legal and Financial Services\n* `logistics` - Logistics and Delivery Services\n* `manufacturing` - Manufacturing and Small-Scale Production\n* `marketing` - Marketing and Advertising Services\n* `music` - Music and Entertainment Services\n* `non_profit` - Non-Profit and Social Enterprises\n* `online_retail` - Online Retail and E-commerce\n* `photography` - Photography and Videography Services\n* `printing` - Printing and Copy Services\n* `professional` - Professional Services\n* `travel` - Travel Agencies\n* `utilities` - Utilities and Renewable Energy Services\n* `wholesale` - Wholesale and Distribution\n* `writing` - Writing and Editing Services\n* `virtual_assistance` - Virtual Assistance and Admin Support\n* `other` - Other","nullable":true},"business_category_display":{"type":"string","readOnly":true},"business_website":{"type":"string","format":"uri","nullable":true,"maxLength":300},"logo_url":{"type":"string","nullable":true,"readOnly":true},"owner":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"member_count":{"type":"integer","nullable":true,"readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["business_category_display","business_description","language_display","logo_url","member_count","name","owner"]}}}}
```

## The OrganisationOwner object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"OrganisationOwner":{"type":"object","description":"Organisation model for owners (read/write, full surface).","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","nullable":true},"language":{"enum":["en","sw","de","es","hi","ar","ko","pt","af","el","fr","ta","ru","zh-hans","",null],"type":"string","description":"* `en` - English\n* `sw` - Swahili\n* `de` - German\n* `es` - Spanish\n* `hi` - Hindi\n* `ar` - Arabic\n* `ko` - Korean\n* `pt` - Portuguese\n* `af` - Afrikaans\n* `el` - Greek\n* `fr` - French\n* `ta` - Tamil\n* `ru` - Russian\n* `zh-hans` - Simplified Chinese","nullable":true},"language_display":{"type":"string","readOnly":true},"business_description":{"type":"string","nullable":true},"business_category":{"enum":["agriculture","cleaning","construction","consulting","creative","education","events","handyman","health","home_based","hospitality","it_support","legal","logistics","manufacturing","marketing","music","non_profit","online_retail","photography","printing","professional","travel","utilities","wholesale","writing","virtual_assistance","other","",null],"type":"string","description":"* `agriculture` - Agriculture and Farming\n* `cleaning` - Cleaning Services\n* `construction` - Construction and Real Estate Services\n* `consulting` - Consulting and Freelancing\n* `creative` - Creative and Design Services\n* `education` - Education and Tutoring Services\n* `events` - Entertainment and Events Planning\n* `handyman` - Handyman and Home Repair Services\n* `health` - Health and Wellness\n* `home_based` - Home-Based Businesses\n* `hospitality` - Hospitality and Tourism\n* `it_support` - IT and Software Support Services\n* `legal` - Legal and Financial Services\n* `logistics` - Logistics and Delivery Services\n* `manufacturing` - Manufacturing and Small-Scale Production\n* `marketing` - Marketing and Advertising Services\n* `music` - Music and Entertainment Services\n* `non_profit` - Non-Profit and Social Enterprises\n* `online_retail` - Online Retail and E-commerce\n* `photography` - Photography and Videography Services\n* `printing` - Printing and Copy Services\n* `professional` - Professional Services\n* `travel` - Travel Agencies\n* `utilities` - Utilities and Renewable Energy Services\n* `wholesale` - Wholesale and Distribution\n* `writing` - Writing and Editing Services\n* `virtual_assistance` - Virtual Assistance and Admin Support\n* `other` - Other","nullable":true},"business_category_display":{"type":"string","readOnly":true},"other_category":{"type":"string","nullable":true},"how_did_you_hear_about_us":{"enum":["google","social_media","online_ads","word_of_mouth","email_marketing","event","blog","webinar","podcast","tv_radio","print_media","referral","other","",null],"type":"string","description":"* `google` - Google Search\n* `social_media` - Social Media\n* `online_ads` - Online Ads\n* `word_of_mouth` - Word of Mouth\n* `email_marketing` - Email Marketing\n* `event` - Event or Conference\n* `blog` - Blog or Article\n* `webinar` - Webinar or Online Workshop\n* `podcast` - Podcast\n* `tv_radio` - TV or Radio Advertisement\n* `print_media` - Print Media\n* `referral` - Referral Program\n* `other` - Other","nullable":true},"business_website":{"type":"string","format":"uri","nullable":true,"maxLength":300},"vat_number":{"type":"string","nullable":true,"description":"VAT/Tax registration number","maxLength":100},"logo_url":{"type":"string","nullable":true,"readOnly":true},"setup_done":{"type":"boolean"},"address":{"allOf":[{"$ref":"#/components/schemas/Address"}],"nullable":true},"banking_information":{"allOf":[{"$ref":"#/components/schemas/BankingInformation"}],"nullable":true},"owner":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"member_count":{"type":"integer","nullable":true,"readOnly":true},"default_currency":{"type":"string","description":"Default currency code (ISO 4217) for financial transactions","maxLength":3},"default_vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Default VAT Rate (%)","description":"Default VAT/tax rate percentage for line items"},"financial_year_end":{"enum":["01-31","02-28","03-31","04-30","05-31","06-30","07-31","08-31","09-30","10-31","11-30","12-31"],"type":"string","description":"Month and day when the financial year ends (MM-DD format)\n\n* `01-31` - January 31\n* `02-28` - February 28\n* `03-31` - March 31\n* `04-30` - April 30\n* `05-31` - May 31\n* `06-30` - June 30\n* `07-31` - July 31\n* `08-31` - August 31\n* `09-30` - September 30\n* `10-31` - October 31\n* `11-30` - November 30\n* `12-31` - December 31"},"financial_year_end_display":{"type":"string","readOnly":true},"accounting_method":{"enum":["cash","accrual"],"type":"string","description":"Accounting method for financial reporting\n\n* `cash` - Cash Basis\n* `accrual` - Accrual Basis"},"accounting_method_display":{"type":"string","readOnly":true},"reporting_currency":{"enum":["USD","EUR","GBP","JPY","CAD","AUD","CHF","CNY","INR","ZAR","KES","NGN","GHS","EGP","MAD","TZS","UGX","RWF","ETB","BWP"],"type":"string","description":"Primary currency for financial reporting and statements\n\n* `USD` - US Dollar (USD)\n* `EUR` - Euro (EUR)\n* `GBP` - British Pound (GBP)\n* `JPY` - Japanese Yen (JPY)\n* `CAD` - Canadian Dollar (CAD)\n* `AUD` - Australian Dollar (AUD)\n* `CHF` - Swiss Franc (CHF)\n* `CNY` - Chinese Yuan (CNY)\n* `INR` - Indian Rupee (INR)\n* `ZAR` - South African Rand (ZAR)\n* `KES` - Kenyan Shilling (KES)\n* `NGN` - Nigerian Naira (NGN)\n* `GHS` - Ghanaian Cedi (GHS)\n* `EGP` - Egyptian Pound (EGP)\n* `MAD` - Moroccan Dirham (MAD)\n* `TZS` - Tanzanian Shilling (TZS)\n* `UGX` - Ugandan Shilling (UGX)\n* `RWF` - Rwandan Franc (RWF)\n* `ETB` - Ethiopian Birr (ETB)\n* `BWP` - Botswana Pula (BWP)"},"reporting_currency_display":{"type":"string","readOnly":true},"enable_multi_currency":{"type":"boolean","description":"Enable multi-currency transactions and reporting"},"auto_close_financial_year":{"type":"boolean","description":"Automatically close financial year and create opening balances"},"retain_transaction_history":{"type":"boolean","description":"Keep detailed transaction history after year-end closing"},"financial_year_lock_date":{"type":"string","format":"date","nullable":true,"description":"Date before which transactions cannot be modified"},"current_financial_year_label":{"type":"string","nullable":true,"readOnly":true},"contact_agent_active":{"type":"boolean","description":"Enable Contact Agent for managing contacts and client relationships"},"finance_agent_active":{"type":"boolean","description":"Enable Finance Agent for financial management and accounting"},"business_agent_active":{"type":"boolean","description":"Enable Business Agent for general business operations and strategy"},"asset_agent_active":{"type":"boolean","description":"Enable Asset Agent for asset management and inventory tracking"},"client_agent_active":{"type":"boolean","description":"Enable Client Agent for client relationship management"},"docs_agent_active":{"type":"boolean","description":"Enable Docs Agent for document management and file organization"},"notes_agent_active":{"type":"boolean","description":"Enable Notes Agent for note-taking and knowledge management"},"project_agent_active":{"type":"boolean","description":"Enable Project Agent for project management and task tracking"},"user_manager_agent_active":{"type":"boolean","description":"Enable User Manager Agent for user management and permissions"},"stripe_customer_id":{"type":"string","nullable":true,"description":"Stripe customer ID for billing and subscriptions","maxLength":100},"monthly_ai_credits_allocated":{"type":"string","format":"decimal","pattern":"^-?\\d{0,4}(?:\\.\\d{0,2})?$","title":"Monthly AI Credits Allocated (USD)","description":"Monthly AI credits allocated based on pricing tier"},"monthly_ai_credits_used":{"type":"string","format":"decimal","pattern":"^-?\\d{0,4}(?:\\.\\d{0,2})?$","title":"Monthly AI Credits Used (USD)","description":"AI credits used in current month"},"monthly_ai_credits_remaining":{"type":"string","format":"decimal","pattern":"^-?\\d{0,4}(?:\\.\\d{0,2})?$","title":"Monthly AI Credits Remaining (USD)","description":"AI credits remaining in current month"},"last_monthly_reset_date":{"type":"string","format":"date","nullable":true,"description":"Date when monthly AI credits were last reset"},"current_billing_cycle_start":{"type":"string","format":"date","nullable":true,"description":"Start date of current monthly billing cycle"},"current_billing_cycle_end":{"type":"string","format":"date","nullable":true,"description":"End date of current monthly billing cycle"},"purchased_seats":{"type":"integer","maximum":2147483647,"minimum":0,"description":"Number of additional seats purchased beyond the base plan"},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["accounting_method_display","business_category_display","current_financial_year_label","financial_year_end_display","language_display","logo_url","member_count","owner","reporting_currency_display"]},"Address":{"type":"object","description":"Serializer for Address model with essential location fields.","properties":{"address_line_1":{"type":"string","nullable":true,"maxLength":300},"city":{"type":"string","nullable":true,"maxLength":300},"province_state":{"type":"string","nullable":true,"title":"Province/State","maxLength":300},"postal_code":{"type":"string","nullable":true,"maxLength":300},"country_name":{"type":"string","readOnly":true}},"required":["country_name"]},"BankingInformation":{"type":"object","description":"Serializer for BankingInformation with PII hygiene:\n- `account_number` is write-only\n- expose masked `account_number_last4` for reads","properties":{"bank_name":{"type":"string","nullable":true,"maxLength":200},"account_number_last4":{"type":"string","nullable":true,"readOnly":true},"branch_code":{"type":"string","nullable":true,"maxLength":50},"account_type":{"enum":["checking","savings","business","other","",null],"type":"string","description":"* `checking` - Checking\n* `savings` - Savings\n* `business` - Business\n* `other` - Other","nullable":true},"routing_number":{"type":"string","nullable":true,"maxLength":50},"swift_code":{"type":"string","nullable":true,"maxLength":50},"date_created":{"type":"string","format":"date-time","readOnly":true},"last_updated":{"type":"string","format":"date-time","readOnly":true},"account_type_display":{"type":"string","readOnly":true}},"required":["account_number_last4","account_type_display","date_created","last_updated"]}}}}
```

## The OrganisationOwnerRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"OrganisationOwnerRequest":{"type":"object","description":"Organisation model for owners (read/write, full surface).","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","nullable":true},"language":{"enum":["en","sw","de","es","hi","ar","ko","pt","af","el","fr","ta","ru","zh-hans","",null],"type":"string","description":"* `en` - English\n* `sw` - Swahili\n* `de` - German\n* `es` - Spanish\n* `hi` - Hindi\n* `ar` - Arabic\n* `ko` - Korean\n* `pt` - Portuguese\n* `af` - Afrikaans\n* `el` - Greek\n* `fr` - French\n* `ta` - Tamil\n* `ru` - Russian\n* `zh-hans` - Simplified Chinese","nullable":true},"business_description":{"type":"string","nullable":true},"business_category":{"enum":["agriculture","cleaning","construction","consulting","creative","education","events","handyman","health","home_based","hospitality","it_support","legal","logistics","manufacturing","marketing","music","non_profit","online_retail","photography","printing","professional","travel","utilities","wholesale","writing","virtual_assistance","other","",null],"type":"string","description":"* `agriculture` - Agriculture and Farming\n* `cleaning` - Cleaning Services\n* `construction` - Construction and Real Estate Services\n* `consulting` - Consulting and Freelancing\n* `creative` - Creative and Design Services\n* `education` - Education and Tutoring Services\n* `events` - Entertainment and Events Planning\n* `handyman` - Handyman and Home Repair Services\n* `health` - Health and Wellness\n* `home_based` - Home-Based Businesses\n* `hospitality` - Hospitality and Tourism\n* `it_support` - IT and Software Support Services\n* `legal` - Legal and Financial Services\n* `logistics` - Logistics and Delivery Services\n* `manufacturing` - Manufacturing and Small-Scale Production\n* `marketing` - Marketing and Advertising Services\n* `music` - Music and Entertainment Services\n* `non_profit` - Non-Profit and Social Enterprises\n* `online_retail` - Online Retail and E-commerce\n* `photography` - Photography and Videography Services\n* `printing` - Printing and Copy Services\n* `professional` - Professional Services\n* `travel` - Travel Agencies\n* `utilities` - Utilities and Renewable Energy Services\n* `wholesale` - Wholesale and Distribution\n* `writing` - Writing and Editing Services\n* `virtual_assistance` - Virtual Assistance and Admin Support\n* `other` - Other","nullable":true},"other_category":{"type":"string","nullable":true},"how_did_you_hear_about_us":{"enum":["google","social_media","online_ads","word_of_mouth","email_marketing","event","blog","webinar","podcast","tv_radio","print_media","referral","other","",null],"type":"string","description":"* `google` - Google Search\n* `social_media` - Social Media\n* `online_ads` - Online Ads\n* `word_of_mouth` - Word of Mouth\n* `email_marketing` - Email Marketing\n* `event` - Event or Conference\n* `blog` - Blog or Article\n* `webinar` - Webinar or Online Workshop\n* `podcast` - Podcast\n* `tv_radio` - TV or Radio Advertisement\n* `print_media` - Print Media\n* `referral` - Referral Program\n* `other` - Other","nullable":true},"business_website":{"type":"string","format":"uri","nullable":true,"maxLength":300},"vat_number":{"type":"string","nullable":true,"description":"VAT/Tax registration number","maxLength":100},"setup_done":{"type":"boolean"},"address":{"allOf":[{"$ref":"#/components/schemas/AddressRequest"}],"nullable":true},"banking_information":{"allOf":[{"$ref":"#/components/schemas/BankingInformationRequest"}],"nullable":true},"default_currency":{"type":"string","minLength":1,"description":"Default currency code (ISO 4217) for financial transactions","maxLength":3},"default_vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Default VAT Rate (%)","description":"Default VAT/tax rate percentage for line items"},"financial_year_end":{"enum":["01-31","02-28","03-31","04-30","05-31","06-30","07-31","08-31","09-30","10-31","11-30","12-31"],"type":"string","description":"Month and day when the financial year ends (MM-DD format)\n\n* `01-31` - January 31\n* `02-28` - February 28\n* `03-31` - March 31\n* `04-30` - April 30\n* `05-31` - May 31\n* `06-30` - June 30\n* `07-31` - July 31\n* `08-31` - August 31\n* `09-30` - September 30\n* `10-31` - October 31\n* `11-30` - November 30\n* `12-31` - December 31"},"accounting_method":{"enum":["cash","accrual"],"type":"string","description":"Accounting method for financial reporting\n\n* `cash` - Cash Basis\n* `accrual` - Accrual Basis"},"reporting_currency":{"enum":["USD","EUR","GBP","JPY","CAD","AUD","CHF","CNY","INR","ZAR","KES","NGN","GHS","EGP","MAD","TZS","UGX","RWF","ETB","BWP"],"type":"string","description":"Primary currency for financial reporting and statements\n\n* `USD` - US Dollar (USD)\n* `EUR` - Euro (EUR)\n* `GBP` - British Pound (GBP)\n* `JPY` - Japanese Yen (JPY)\n* `CAD` - Canadian Dollar (CAD)\n* `AUD` - Australian Dollar (AUD)\n* `CHF` - Swiss Franc (CHF)\n* `CNY` - Chinese Yuan (CNY)\n* `INR` - Indian Rupee (INR)\n* `ZAR` - South African Rand (ZAR)\n* `KES` - Kenyan Shilling (KES)\n* `NGN` - Nigerian Naira (NGN)\n* `GHS` - Ghanaian Cedi (GHS)\n* `EGP` - Egyptian Pound (EGP)\n* `MAD` - Moroccan Dirham (MAD)\n* `TZS` - Tanzanian Shilling (TZS)\n* `UGX` - Ugandan Shilling (UGX)\n* `RWF` - Rwandan Franc (RWF)\n* `ETB` - Ethiopian Birr (ETB)\n* `BWP` - Botswana Pula (BWP)"},"enable_multi_currency":{"type":"boolean","description":"Enable multi-currency transactions and reporting"},"auto_close_financial_year":{"type":"boolean","description":"Automatically close financial year and create opening balances"},"retain_transaction_history":{"type":"boolean","description":"Keep detailed transaction history after year-end closing"},"financial_year_lock_date":{"type":"string","format":"date","nullable":true,"description":"Date before which transactions cannot be modified"},"contact_agent_active":{"type":"boolean","description":"Enable Contact Agent for managing contacts and client relationships"},"finance_agent_active":{"type":"boolean","description":"Enable Finance Agent for financial management and accounting"},"business_agent_active":{"type":"boolean","description":"Enable Business Agent for general business operations and strategy"},"asset_agent_active":{"type":"boolean","description":"Enable Asset Agent for asset management and inventory tracking"},"client_agent_active":{"type":"boolean","description":"Enable Client Agent for client relationship management"},"docs_agent_active":{"type":"boolean","description":"Enable Docs Agent for document management and file organization"},"notes_agent_active":{"type":"boolean","description":"Enable Notes Agent for note-taking and knowledge management"},"project_agent_active":{"type":"boolean","description":"Enable Project Agent for project management and task tracking"},"user_manager_agent_active":{"type":"boolean","description":"Enable User Manager Agent for user management and permissions"},"stripe_customer_id":{"type":"string","nullable":true,"description":"Stripe customer ID for billing and subscriptions","maxLength":100},"monthly_ai_credits_allocated":{"type":"string","format":"decimal","pattern":"^-?\\d{0,4}(?:\\.\\d{0,2})?$","title":"Monthly AI Credits Allocated (USD)","description":"Monthly AI credits allocated based on pricing tier"},"monthly_ai_credits_used":{"type":"string","format":"decimal","pattern":"^-?\\d{0,4}(?:\\.\\d{0,2})?$","title":"Monthly AI Credits Used (USD)","description":"AI credits used in current month"},"monthly_ai_credits_remaining":{"type":"string","format":"decimal","pattern":"^-?\\d{0,4}(?:\\.\\d{0,2})?$","title":"Monthly AI Credits Remaining (USD)","description":"AI credits remaining in current month"},"last_monthly_reset_date":{"type":"string","format":"date","nullable":true,"description":"Date when monthly AI credits were last reset"},"current_billing_cycle_start":{"type":"string","format":"date","nullable":true,"description":"Start date of current monthly billing cycle"},"current_billing_cycle_end":{"type":"string","format":"date","nullable":true,"description":"End date of current monthly billing cycle"},"purchased_seats":{"type":"integer","maximum":2147483647,"minimum":0,"description":"Number of additional seats purchased beyond the base plan"},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}}},"AddressRequest":{"type":"object","description":"Serializer for Address model with essential location fields.","properties":{"address_line_1":{"type":"string","nullable":true,"maxLength":300},"city":{"type":"string","nullable":true,"maxLength":300},"province_state":{"type":"string","nullable":true,"title":"Province/State","maxLength":300},"postal_code":{"type":"string","nullable":true,"maxLength":300}}},"BankingInformationRequest":{"type":"object","description":"Serializer for BankingInformation with PII hygiene:\n- `account_number` is write-only\n- expose masked `account_number_last4` for reads","properties":{"bank_name":{"type":"string","nullable":true,"maxLength":200},"account_number":{"type":"string","writeOnly":true},"branch_code":{"type":"string","nullable":true,"maxLength":50},"account_type":{"enum":["checking","savings","business","other","",null],"type":"string","description":"* `checking` - Checking\n* `savings` - Savings\n* `business` - Business\n* `other` - Other","nullable":true},"routing_number":{"type":"string","nullable":true,"maxLength":50},"swift_code":{"type":"string","nullable":true,"maxLength":50}}}}}}
```

## The PatchedAccountRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"PatchedAccountRequest":{"type":"object","description":"Comprehensive serializer for Account model.\nHandles chart of accounts with multilingual support and hierarchy.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","minLength":1},"description":{"type":"string","nullable":true},"account_code":{"type":"string","minLength":1,"maxLength":20},"account_type":{"enum":["asset","liability","equity","income","expense"],"type":"string","description":"* `asset` - Asset\n* `liability` - Liability\n* `equity` - Equity\n* `income` - Income\n* `expense` - Expense"},"account_category":{"enum":["current_assets","fixed_assets","intangible_assets","current_liabilities","long_term_liabilities","owner_equity","retained_earnings","operating_income","other_income","cost_of_goods_sold","operating_expenses","administrative_expenses","financial_expenses","other_expenses"],"type":"string","description":"* `current_assets` - Current Assets\n* `fixed_assets` - Fixed Assets\n* `intangible_assets` - Intangible Assets\n* `current_liabilities` - Current Liabilities\n* `long_term_liabilities` - Long-term Liabilities\n* `owner_equity` - Owner Equity\n* `retained_earnings` - Retained Earnings\n* `operating_income` - Operating Income\n* `other_income` - Other Income\n* `cost_of_goods_sold` - Cost of Goods Sold\n* `operating_expenses` - Operating Expenses\n* `administrative_expenses` - Administrative Expenses\n* `financial_expenses` - Financial Expenses\n* `other_expenses` - Other Expenses"},"parent_account_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"is_active":{"type":"boolean"},"is_system_account":{"type":"boolean","description":"System accounts cannot be deleted"}}}}}}
```

## The PatchedAssetRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"PatchedAssetRequest":{"type":"object","description":"Full serializer for Asset creation and updates.\nHandles translatable fields correctly.","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","nullable":true},"asset_code":{"type":"string","nullable":true,"maxLength":100},"serial_number":{"type":"string","nullable":true,"maxLength":200},"asset_type":{"enum":["ppe","equipment","furniture","vehicle","computer","software","building","land","intangible","other"],"type":"string","description":"Asset type is required.\n\n* `ppe` - Property, Plant & Equipment\n* `equipment` - Equipment\n* `furniture` - Furniture & Fixtures\n* `vehicle` - Vehicle\n* `computer` - Computer & IT Equipment\n* `software` - Software\n* `building` - Building\n* `land` - Land\n* `intangible` - Intangible Asset\n* `other` - Other"},"category":{"type":"string","nullable":true,"maxLength":200},"brand":{"type":"string","nullable":true,"maxLength":200},"model":{"type":"string","nullable":true,"maxLength":200},"purchase_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","description":"Purchase price is required and must be non-negative."},"useful_life_years":{"type":"integer","maximum":100,"minimum":1,"title":"Useful Life (Years)","description":"Expected useful life in years"},"purchase_date":{"type":"string","format":"date","description":"Purchase date is required."},"warranty_expiry_date":{"type":"string","format":"date","nullable":true},"disposal_date":{"type":"string","format":"date","nullable":true},"status":{"enum":["active","inactive","disposed","sold","damaged","under_repair","stolen"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `disposed` - Disposed\n* `sold` - Sold\n* `damaged` - Damaged\n* `under_repair` - Under Repair\n* `stolen` - Stolen"},"condition":{"enum":["excellent","good","fair","poor","damaged"],"type":"string","description":"* `excellent` - Excellent\n* `good` - Good\n* `fair` - Fair\n* `poor` - Poor\n* `damaged` - Damaged"},"location":{"type":"string","nullable":true,"maxLength":300},"assigned_to_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1,"description":"Unique ID of person to assign asset to"},"image":{"type":"string","format":"binary","nullable":true,"title":"Asset Image","description":"Asset image for identification"},"receipt_document":{"type":"string","format":"binary","nullable":true,"title":"Receipt/Invoice Document","description":"Upload receipt, invoice, or purchase document (PDF, DOC, DOCX, JPG, PNG)"},"supplier_name":{"type":"string","nullable":true,"maxLength":300},"purchase_order_number":{"type":"string","nullable":true,"maxLength":100},"invoice_number":{"type":"string","nullable":true,"maxLength":100}}}}}}
```

## The PatchedBillRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"PatchedBillRequest":{"type":"object","description":"Comprehensive serializer for Bill model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string","minLength":1},"description":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"bill_number":{"type":"string","minLength":1,"maxLength":100},"supplier_invoice_number":{"type":"string","nullable":true,"maxLength":100},"status":{"enum":["received","approved","paid","partially_paid","overdue","disputed","cancelled"],"type":"string","description":"* `received` - Received\n* `approved` - Approved for Payment\n* `paid` - Paid\n* `partially_paid` - Partially Paid\n* `overdue` - Overdue\n* `disputed` - Disputed\n* `cancelled` - Cancelled"},"vendor_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"bill_date":{"type":"string","format":"date"},"due_date":{"type":"string","format":"date"},"received_date":{"type":"string","format":"date"},"subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"tax_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Tax Rate (%)"},"tax_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"paid_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"document":{"type":"string","format":"binary","nullable":true,"title":"Bill Document","description":"Scanned bill document (PDF, image)"}}}}}}
```

## The PatchedClientRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"PatchedClientRequest":{"type":"object","description":"Comprehensive serializer for Client model.\nHandles multilingual fields, nested relationships, and computed fields.\nOptimized for list and detail views with optional prefetching support.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","nullable":true},"entity_type":{"enum":["individual","company","non_profit","government","partnership","other"],"type":"string","description":"* `individual` - Individual\n* `company` - Company\n* `non_profit` - Non-Profit Organization\n* `government` - Government Entity\n* `partnership` - Partnership\n* `other` - Other"},"lifecycle_stage":{"enum":["prospect","active_client","matured_client","inactive","dormant","lost_opportunity"],"type":"string","description":"* `prospect` - Prospect\n* `active_client` - Active Client\n* `matured_client` - Matured Client\n* `inactive` - Inactive\n* `dormant` - Dormant\n* `lost_opportunity` - Lost Opportunity","title":"Client Lifecycle Stage"},"industry":{"enum":["agriculture","cleaning","construction","consulting","creative","education","events","handyman","health","home_based","hospitality","it_support","legal","logistics","manufacturing","marketing","music","non_profit","online_retail","photography","printing","professional","travel","utilities","wholesale","writing","virtual_assistance","other","",null],"type":"string","description":"* `agriculture` - Agriculture and Farming\n* `cleaning` - Cleaning Services\n* `construction` - Construction and Real Estate Services\n* `consulting` - Consulting and Freelancing\n* `creative` - Creative and Design Services\n* `education` - Education and Tutoring Services\n* `events` - Entertainment and Events Planning\n* `handyman` - Handyman and Home Repair Services\n* `health` - Health and Wellness\n* `home_based` - Home-Based Businesses\n* `hospitality` - Hospitality and Tourism\n* `it_support` - IT and Software Support Services\n* `legal` - Legal and Financial Services\n* `logistics` - Logistics and Delivery Services\n* `manufacturing` - Manufacturing and Small-Scale Production\n* `marketing` - Marketing and Advertising Services\n* `music` - Music and Entertainment Services\n* `non_profit` - Non-Profit and Social Enterprises\n* `online_retail` - Online Retail and E-commerce\n* `photography` - Photography and Videography Services\n* `printing` - Printing and Copy Services\n* `professional` - Professional Services\n* `travel` - Travel Agencies\n* `utilities` - Utilities and Renewable Energy Services\n* `wholesale` - Wholesale and Distribution\n* `writing` - Writing and Editing Services\n* `virtual_assistance` - Virtual Assistance and Admin Support\n* `other` - Other","nullable":true},"website":{"type":"string","format":"uri","nullable":true,"maxLength":300},"company_size":{"type":"string","nullable":true,"maxLength":100},"annual_revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Annual revenue in USD"},"default_currency":{"type":"string","minLength":1,"description":"Default currency code (ISO 4217) for this entity's transactions","maxLength":3},"first_contact_date":{"type":"string","format":"date","nullable":true},"last_contact_date":{"type":"string","format":"date","nullable":true},"next_follow_up_date":{"type":"string","format":"date","nullable":true},"address":{"allOf":[{"$ref":"#/components/schemas/ClientAddressRequest"}],"nullable":true},"banking_information":{"allOf":[{"$ref":"#/components/schemas/ClientBankingInformationRequest"}],"nullable":true}}},"ClientAddressRequest":{"type":"object","description":"Serializer for Address model.\nCountry field is explicitly defined as CharField to handle django-countries CountryField.","properties":{"address_line_1":{"type":"string","nullable":true,"maxLength":300},"address_line_2":{"type":"string","nullable":true,"maxLength":300},"city":{"type":"string","nullable":true,"maxLength":300},"province_state":{"type":"string","nullable":true,"title":"Province/State","maxLength":300},"postal_code":{"type":"string","nullable":true,"maxLength":300},"country":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true,"title":"Phone Number","pattern":"^\\+?1?\\d{9,15}$","maxLength":17}}},"ClientBankingInformationRequest":{"type":"object","description":"Serializer for BankingInformation model with all banking fields.","properties":{"bank_name":{"type":"string","nullable":true,"maxLength":200},"account_number":{"type":"string","nullable":true,"maxLength":100},"branch_code":{"type":"string","nullable":true,"maxLength":50},"account_type":{"enum":["checking","savings","business","other","",null],"type":"string","description":"* `checking` - Checking\n* `savings` - Savings\n* `business` - Business\n* `other` - Other","nullable":true},"routing_number":{"type":"string","nullable":true,"maxLength":50},"swift_code":{"type":"string","nullable":true,"maxLength":50}}}}}}
```

## The PatchedContactGroupRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"PatchedContactGroupRequest":{"type":"object","description":"Serializer for ContactGroup model supporting both creation and listing.\nHandles multilingual fields through parler TranslatableModelSerializer.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","nullable":true},"translations":{"type":"string"},"is_active":{"type":"boolean"},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}}}}}}
```

## The PatchedContactRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"PatchedContactRequest":{"type":"object","description":"Comprehensive serializer for Contact model.\nHandles contact creation, updates, and group assignment.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"translations":{"type":"string"},"contact_group":{"type":"string","nullable":true,"description":"Contact group unique_id (optional - can be assigned later)"},"entity_type":{"enum":["client","vendor","lead"],"type":"string","description":"Type of entity (client, vendor, lead)\n\n* `client` - Client\n* `vendor` - Vendor\n* `lead` - Lead"},"entity_id":{"type":"string","nullable":true,"description":"ID of the entity this contact belongs to (optional for potential clients/vendors)","maxLength":100},"first_name":{"type":"string","minLength":1,"maxLength":150},"last_name":{"type":"string","minLength":1,"maxLength":150},"email":{"type":"string","format":"email","nullable":true,"maxLength":254},"phone":{"type":"string","nullable":true,"maxLength":17},"mobile":{"type":"string","nullable":true,"maxLength":17},"linkedin_url":{"type":"string","format":"uri","nullable":true,"description":"LinkedIn profile URL","maxLength":200},"job_title":{"type":"string","nullable":true},"department":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"is_active":{"type":"boolean"},"primary_contact":{"type":"boolean","description":"Indicates if this is the primary contact for the entity"},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}}}}}}
```

## The PatchedExpenseRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"PatchedExpenseRequest":{"type":"object","description":"Comprehensive serializer for Expense model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string","minLength":1},"description":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"expense_number":{"type":"string","minLength":1,"maxLength":100},"account_id":{"type":"string","writeOnly":true,"minLength":1},"status":{"enum":["draft","submitted","approved","paid","rejected","reimbursed"],"type":"string","description":"* `draft` - Draft\n* `submitted` - Submitted for Approval\n* `approved` - Approved\n* `paid` - Paid\n* `rejected` - Rejected\n* `reimbursed` - Reimbursed"},"expense_date":{"type":"string","format":"date"},"amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"tax_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"vendor_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"employee_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"receipt":{"type":"string","format":"binary","nullable":true,"description":"Receipt or supporting document"},"vat_processed":{"type":"boolean","description":"Whether VAT has been processed for reconciliation"}}}}}}
```

## The PatchedInvoiceRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"PatchedInvoiceRequest":{"type":"object","description":"Comprehensive serializer for Invoice model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string","minLength":1},"description":{"type":"string","nullable":true},"invoice_number":{"type":"string","minLength":1,"maxLength":100},"status":{"enum":["draft","sent","viewed","paid","partially_paid","overdue","cancelled","refunded"],"type":"string","description":"* `draft` - Draft\n* `sent` - Sent\n* `viewed` - Viewed by Client\n* `paid` - Paid\n* `partially_paid` - Partially Paid\n* `overdue` - Overdue\n* `cancelled` - Cancelled\n* `refunded` - Refunded"},"invoice_date":{"type":"string","format":"date","nullable":true},"due_date":{"type":"string","format":"date"},"paid_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"client_id":{"type":"string","writeOnly":true,"minLength":1,"description":"Client unique_id (required)"},"items":{"type":"array","items":{"$ref":"#/components/schemas/InvoiceItemRequest"}}}},"InvoiceItemRequest":{"type":"object","description":"Serializer for invoice line items.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"product_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"service_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"quantity":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"discount_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Discount %"},"vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"VAT Rate (%)","description":"VAT/tax rate percentage for this line item"},"currency":{"type":"string","minLength":1,"description":"Currency code (ISO 4217) for this line item","maxLength":3}},"required":["quantity","unit_price"]}}}}
```

## The PatchedLeadRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"PatchedLeadRequest":{"type":"object","description":"Comprehensive serializer for Lead model.\nHandles multilingual fields, sales stage relationships, and computed metrics like weighted value.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string","minLength":1},"description":{"type":"string","nullable":true},"qualification_notes":{"type":"string","nullable":true},"priority":{"enum":["low","medium","high","critical"],"type":"string","description":"* `low` - Low\n* `medium` - Medium\n* `high` - High\n* `critical` - Critical"},"lead_source":{"enum":["website","social_media","email_marketing","referral","cold_calling","trade_show","advertising","content_marketing","seo","ppc","partner","other"],"type":"string","description":"Select one of the predefined lead sources.\n\n* `website` - Website\n* `social_media` - Social Media\n* `email_marketing` - Email Marketing\n* `referral` - Referral\n* `cold_calling` - Cold Calling\n* `trade_show` - Trade Show\n* `advertising` - Advertising\n* `content_marketing` - Content Marketing\n* `seo` - SEO\n* `ppc` - Pay-per-Click\n* `partner` - Partner\n* `other` - Other"},"estimated_value":{"type":"string","format":"decimal","pattern":"^-?\\d{0,16}(?:\\.\\d{0,2})?$","nullable":true},"win_probability":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","nullable":true},"sales_stage":{"type":"string","nullable":true,"description":"Unique ID of an existing sales stage."},"client":{"type":"string","nullable":true,"description":"Unique ID of an existing client."},"expected_close_date":{"type":"string","format":"date","nullable":true},"follow_up_date":{"type":"string","format":"date-time","nullable":true,"title":"Next Follow Up Date"}}}}}}
```

## The PatchedLiabilityRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"PatchedLiabilityRequest":{"type":"object","description":"Full serializer for Liability creation and updates.\nHandles translatable fields correctly.","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","nullable":true},"liability_code":{"type":"string","nullable":true,"maxLength":100},"reference_number":{"type":"string","nullable":true,"maxLength":200},"liability_type":{"enum":["accounts_payable","notes_payable","loans_payable","mortgage_payable","bonds_payable","accrued_expenses","deferred_revenue","tax_payable","salary_payable","interest_payable","rent_payable","utilities_payable","lease_obligations","warranty_obligations","legal_obligations","other"],"type":"string","description":"* `accounts_payable` - Accounts Payable\n* `notes_payable` - Notes Payable\n* `loans_payable` - Loans Payable\n* `mortgage_payable` - Mortgage Payable\n* `bonds_payable` - Bonds Payable\n* `accrued_expenses` - Accrued Expenses\n* `deferred_revenue` - Deferred Revenue\n* `tax_payable` - Tax Payable\n* `salary_payable` - Salary/Wages Payable\n* `interest_payable` - Interest Payable\n* `rent_payable` - Rent Payable\n* `utilities_payable` - Utilities Payable\n* `lease_obligations` - Lease Obligations\n* `warranty_obligations` - Warranty Obligations\n* `legal_obligations` - Legal Obligations\n* `other` - Other"},"classification":{"enum":["current","non_current","contingent"],"type":"string","description":"* `current` - Current Liability\n* `non_current` - Non-Current Liability\n* `contingent` - Contingent Liability"},"original_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","description":"Original amount is required and must be non-negative."},"current_balance":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","description":"Current outstanding balance"},"paid_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","description":"Total amount paid so far"},"interest_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","nullable":true,"title":"Interest Rate (%)","description":"Annual interest rate percentage"},"liability_date":{"type":"string","format":"date","description":"Liability date is required."},"due_date":{"type":"string","format":"date","nullable":true},"payment_date":{"type":"string","format":"date","nullable":true},"maturity_date":{"type":"string","format":"date","nullable":true},"status":{"enum":["pending","overdue","paid","partially_paid","disputed","cancelled","deferred"],"type":"string","description":"* `pending` - Pending\n* `overdue` - Overdue\n* `paid` - Paid\n* `partially_paid` - Partially Paid\n* `disputed` - Disputed\n* `cancelled` - Cancelled\n* `deferred` - Deferred"},"priority":{"enum":["low","medium","high","critical"],"type":"string","description":"* `low` - Low\n* `medium` - Medium\n* `high` - High\n* `critical` - Critical"},"creditor_name":{"type":"string","nullable":true,"title":"Creditor/Vendor Name","maxLength":300},"creditor_contact":{"type":"string","nullable":true,"maxLength":200},"creditor_email":{"type":"string","format":"email","nullable":true,"maxLength":254},"creditor_phone":{"type":"string","nullable":true,"maxLength":50},"payment_terms":{"type":"string","nullable":true,"maxLength":200},"late_fee_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","nullable":true,"title":"Late Fee Rate (%)","description":"Late payment fee percentage"},"category":{"type":"string","nullable":true,"maxLength":200},"department":{"type":"string","nullable":true,"maxLength":200},"project_reference":{"type":"string","nullable":true,"maxLength":200},"supporting_document":{"type":"string","format":"binary","nullable":true,"description":"Upload contract, invoice, or agreement document (PDF, DOC, DOCX, JPG, PNG)"}}}}}}
```

## The PatchedOrganisationOwnerRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"PatchedOrganisationOwnerRequest":{"type":"object","description":"Organisation model for owners (read/write, full surface).","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","nullable":true},"language":{"enum":["en","sw","de","es","hi","ar","ko","pt","af","el","fr","ta","ru","zh-hans","",null],"type":"string","description":"* `en` - English\n* `sw` - Swahili\n* `de` - German\n* `es` - Spanish\n* `hi` - Hindi\n* `ar` - Arabic\n* `ko` - Korean\n* `pt` - Portuguese\n* `af` - Afrikaans\n* `el` - Greek\n* `fr` - French\n* `ta` - Tamil\n* `ru` - Russian\n* `zh-hans` - Simplified Chinese","nullable":true},"business_description":{"type":"string","nullable":true},"business_category":{"enum":["agriculture","cleaning","construction","consulting","creative","education","events","handyman","health","home_based","hospitality","it_support","legal","logistics","manufacturing","marketing","music","non_profit","online_retail","photography","printing","professional","travel","utilities","wholesale","writing","virtual_assistance","other","",null],"type":"string","description":"* `agriculture` - Agriculture and Farming\n* `cleaning` - Cleaning Services\n* `construction` - Construction and Real Estate Services\n* `consulting` - Consulting and Freelancing\n* `creative` - Creative and Design Services\n* `education` - Education and Tutoring Services\n* `events` - Entertainment and Events Planning\n* `handyman` - Handyman and Home Repair Services\n* `health` - Health and Wellness\n* `home_based` - Home-Based Businesses\n* `hospitality` - Hospitality and Tourism\n* `it_support` - IT and Software Support Services\n* `legal` - Legal and Financial Services\n* `logistics` - Logistics and Delivery Services\n* `manufacturing` - Manufacturing and Small-Scale Production\n* `marketing` - Marketing and Advertising Services\n* `music` - Music and Entertainment Services\n* `non_profit` - Non-Profit and Social Enterprises\n* `online_retail` - Online Retail and E-commerce\n* `photography` - Photography and Videography Services\n* `printing` - Printing and Copy Services\n* `professional` - Professional Services\n* `travel` - Travel Agencies\n* `utilities` - Utilities and Renewable Energy Services\n* `wholesale` - Wholesale and Distribution\n* `writing` - Writing and Editing Services\n* `virtual_assistance` - Virtual Assistance and Admin Support\n* `other` - Other","nullable":true},"other_category":{"type":"string","nullable":true},"how_did_you_hear_about_us":{"enum":["google","social_media","online_ads","word_of_mouth","email_marketing","event","blog","webinar","podcast","tv_radio","print_media","referral","other","",null],"type":"string","description":"* `google` - Google Search\n* `social_media` - Social Media\n* `online_ads` - Online Ads\n* `word_of_mouth` - Word of Mouth\n* `email_marketing` - Email Marketing\n* `event` - Event or Conference\n* `blog` - Blog or Article\n* `webinar` - Webinar or Online Workshop\n* `podcast` - Podcast\n* `tv_radio` - TV or Radio Advertisement\n* `print_media` - Print Media\n* `referral` - Referral Program\n* `other` - Other","nullable":true},"business_website":{"type":"string","format":"uri","nullable":true,"maxLength":300},"vat_number":{"type":"string","nullable":true,"description":"VAT/Tax registration number","maxLength":100},"setup_done":{"type":"boolean"},"address":{"allOf":[{"$ref":"#/components/schemas/AddressRequest"}],"nullable":true},"banking_information":{"allOf":[{"$ref":"#/components/schemas/BankingInformationRequest"}],"nullable":true},"default_currency":{"type":"string","minLength":1,"description":"Default currency code (ISO 4217) for financial transactions","maxLength":3},"default_vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Default VAT Rate (%)","description":"Default VAT/tax rate percentage for line items"},"financial_year_end":{"enum":["01-31","02-28","03-31","04-30","05-31","06-30","07-31","08-31","09-30","10-31","11-30","12-31"],"type":"string","description":"Month and day when the financial year ends (MM-DD format)\n\n* `01-31` - January 31\n* `02-28` - February 28\n* `03-31` - March 31\n* `04-30` - April 30\n* `05-31` - May 31\n* `06-30` - June 30\n* `07-31` - July 31\n* `08-31` - August 31\n* `09-30` - September 30\n* `10-31` - October 31\n* `11-30` - November 30\n* `12-31` - December 31"},"accounting_method":{"enum":["cash","accrual"],"type":"string","description":"Accounting method for financial reporting\n\n* `cash` - Cash Basis\n* `accrual` - Accrual Basis"},"reporting_currency":{"enum":["USD","EUR","GBP","JPY","CAD","AUD","CHF","CNY","INR","ZAR","KES","NGN","GHS","EGP","MAD","TZS","UGX","RWF","ETB","BWP"],"type":"string","description":"Primary currency for financial reporting and statements\n\n* `USD` - US Dollar (USD)\n* `EUR` - Euro (EUR)\n* `GBP` - British Pound (GBP)\n* `JPY` - Japanese Yen (JPY)\n* `CAD` - Canadian Dollar (CAD)\n* `AUD` - Australian Dollar (AUD)\n* `CHF` - Swiss Franc (CHF)\n* `CNY` - Chinese Yuan (CNY)\n* `INR` - Indian Rupee (INR)\n* `ZAR` - South African Rand (ZAR)\n* `KES` - Kenyan Shilling (KES)\n* `NGN` - Nigerian Naira (NGN)\n* `GHS` - Ghanaian Cedi (GHS)\n* `EGP` - Egyptian Pound (EGP)\n* `MAD` - Moroccan Dirham (MAD)\n* `TZS` - Tanzanian Shilling (TZS)\n* `UGX` - Ugandan Shilling (UGX)\n* `RWF` - Rwandan Franc (RWF)\n* `ETB` - Ethiopian Birr (ETB)\n* `BWP` - Botswana Pula (BWP)"},"enable_multi_currency":{"type":"boolean","description":"Enable multi-currency transactions and reporting"},"auto_close_financial_year":{"type":"boolean","description":"Automatically close financial year and create opening balances"},"retain_transaction_history":{"type":"boolean","description":"Keep detailed transaction history after year-end closing"},"financial_year_lock_date":{"type":"string","format":"date","nullable":true,"description":"Date before which transactions cannot be modified"},"contact_agent_active":{"type":"boolean","description":"Enable Contact Agent for managing contacts and client relationships"},"finance_agent_active":{"type":"boolean","description":"Enable Finance Agent for financial management and accounting"},"business_agent_active":{"type":"boolean","description":"Enable Business Agent for general business operations and strategy"},"asset_agent_active":{"type":"boolean","description":"Enable Asset Agent for asset management and inventory tracking"},"client_agent_active":{"type":"boolean","description":"Enable Client Agent for client relationship management"},"docs_agent_active":{"type":"boolean","description":"Enable Docs Agent for document management and file organization"},"notes_agent_active":{"type":"boolean","description":"Enable Notes Agent for note-taking and knowledge management"},"project_agent_active":{"type":"boolean","description":"Enable Project Agent for project management and task tracking"},"user_manager_agent_active":{"type":"boolean","description":"Enable User Manager Agent for user management and permissions"},"stripe_customer_id":{"type":"string","nullable":true,"description":"Stripe customer ID for billing and subscriptions","maxLength":100},"monthly_ai_credits_allocated":{"type":"string","format":"decimal","pattern":"^-?\\d{0,4}(?:\\.\\d{0,2})?$","title":"Monthly AI Credits Allocated (USD)","description":"Monthly AI credits allocated based on pricing tier"},"monthly_ai_credits_used":{"type":"string","format":"decimal","pattern":"^-?\\d{0,4}(?:\\.\\d{0,2})?$","title":"Monthly AI Credits Used (USD)","description":"AI credits used in current month"},"monthly_ai_credits_remaining":{"type":"string","format":"decimal","pattern":"^-?\\d{0,4}(?:\\.\\d{0,2})?$","title":"Monthly AI Credits Remaining (USD)","description":"AI credits remaining in current month"},"last_monthly_reset_date":{"type":"string","format":"date","nullable":true,"description":"Date when monthly AI credits were last reset"},"current_billing_cycle_start":{"type":"string","format":"date","nullable":true,"description":"Start date of current monthly billing cycle"},"current_billing_cycle_end":{"type":"string","format":"date","nullable":true,"description":"End date of current monthly billing cycle"},"purchased_seats":{"type":"integer","maximum":2147483647,"minimum":0,"description":"Number of additional seats purchased beyond the base plan"},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}}},"AddressRequest":{"type":"object","description":"Serializer for Address model with essential location fields.","properties":{"address_line_1":{"type":"string","nullable":true,"maxLength":300},"city":{"type":"string","nullable":true,"maxLength":300},"province_state":{"type":"string","nullable":true,"title":"Province/State","maxLength":300},"postal_code":{"type":"string","nullable":true,"maxLength":300}}},"BankingInformationRequest":{"type":"object","description":"Serializer for BankingInformation with PII hygiene:\n- `account_number` is write-only\n- expose masked `account_number_last4` for reads","properties":{"bank_name":{"type":"string","nullable":true,"maxLength":200},"account_number":{"type":"string","writeOnly":true},"branch_code":{"type":"string","nullable":true,"maxLength":50},"account_type":{"enum":["checking","savings","business","other","",null],"type":"string","description":"* `checking` - Checking\n* `savings` - Savings\n* `business` - Business\n* `other` - Other","nullable":true},"routing_number":{"type":"string","nullable":true,"maxLength":50},"swift_code":{"type":"string","nullable":true,"maxLength":50}}}}}}
```

## The PatchedPersonRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"PatchedPersonRequest":{"type":"object","description":"Person model with nested user information and related data.\nSupports reading + writing nested Address/Employee/Banking.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"current_language":{"enum":["en","sw","de","es","hi","ar","ko","pt","af","el","fr","ta","ru","zh-hans"],"type":"string","description":"* `en` - English\n* `sw` - Swahili\n* `de` - German\n* `es` - Spanish\n* `hi` - Hindi\n* `ar` - Arabic\n* `ko` - Korean\n* `pt` - Portuguese\n* `af` - Afrikaans\n* `el` - Greek\n* `fr` - French\n* `ta` - Tamil\n* `ru` - Russian\n* `zh-hans` - Simplified Chinese"},"job_title":{"type":"string","nullable":true,"maxLength":300},"is_owner":{"type":"boolean"},"user_type":{"enum":["user","employee"],"type":"string","description":"* `user` - Regular User\n* `employee` - Employee"},"address":{"allOf":[{"$ref":"#/components/schemas/AddressRequest"}],"nullable":true},"banking_information":{"allOf":[{"$ref":"#/components/schemas/BankingInformationRequest"}],"nullable":true},"employee_information":{"allOf":[{"$ref":"#/components/schemas/EmployeeInformationRequest"}],"nullable":true},"last_login":{"type":"string","format":"date-time","nullable":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}}},"AddressRequest":{"type":"object","description":"Serializer for Address model with essential location fields.","properties":{"address_line_1":{"type":"string","nullable":true,"maxLength":300},"city":{"type":"string","nullable":true,"maxLength":300},"province_state":{"type":"string","nullable":true,"title":"Province/State","maxLength":300},"postal_code":{"type":"string","nullable":true,"maxLength":300}}},"BankingInformationRequest":{"type":"object","description":"Serializer for BankingInformation with PII hygiene:\n- `account_number` is write-only\n- expose masked `account_number_last4` for reads","properties":{"bank_name":{"type":"string","nullable":true,"maxLength":200},"account_number":{"type":"string","writeOnly":true},"branch_code":{"type":"string","nullable":true,"maxLength":50},"account_type":{"enum":["checking","savings","business","other","",null],"type":"string","description":"* `checking` - Checking\n* `savings` - Savings\n* `business` - Business\n* `other` - Other","nullable":true},"routing_number":{"type":"string","nullable":true,"maxLength":50},"swift_code":{"type":"string","nullable":true,"maxLength":50}}},"EmployeeInformationRequest":{"type":"object","description":"Serializer for EmployeeInformation with complete employee data.","properties":{"id_number":{"type":"string","nullable":true,"maxLength":100},"employee_number":{"type":"string","nullable":true,"maxLength":100},"tax_number":{"type":"string","nullable":true,"maxLength":100},"phone_number":{"type":"string","nullable":true,"maxLength":200},"birthday":{"type":"string","format":"date","nullable":true},"linkedin_url":{"type":"string","format":"uri","nullable":true,"title":"LinkedIn Profile","maxLength":300},"emergency_contact":{"type":"string","nullable":true,"maxLength":300},"emergency_phone":{"type":"string","nullable":true,"maxLength":200},"medical_aid_number":{"type":"string","nullable":true,"maxLength":300},"medical_aid_provider":{"type":"string","nullable":true,"maxLength":300},"medical_aid_plan":{"type":"string","nullable":true,"maxLength":300},"medical_conditions":{"type":"string","nullable":true},"allergies":{"type":"string","nullable":true},"medications":{"type":"string","nullable":true},"start_date":{"type":"string","format":"date","nullable":true},"end_date":{"type":"string","format":"date","nullable":true},"is_active_employee":{"type":"boolean"}}}}}}
```

## The PatchedProductRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"PatchedProductRequest":{"type":"object","description":"Full serializer for Product creation and updates.\nHandles translatable fields correctly.","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","nullable":true},"short_description":{"type":"string","nullable":true,"maxLength":500},"product_code":{"type":"string","nullable":true,"maxLength":100},"barcode":{"type":"string","nullable":true,"maxLength":100},"product_type":{"enum":["manufacture","buy"],"type":"string","description":"Product type is required.\n\n* `manufacture` - Manufacture\n* `buy` - Buy"},"category":{"type":"string","nullable":true,"maxLength":200},"brand":{"type":"string","nullable":true,"maxLength":200},"model_number":{"type":"string","nullable":true,"maxLength":200},"unit_of_measure":{"enum":["piece","kg","gram","liter","meter","square_meter","cubic_meter","hour","day","month","year","box","pack","dozen","other"],"type":"string","description":"* `piece` - Piece\n* `kg` - Kilogram\n* `gram` - Gram\n* `liter` - Liter\n* `meter` - Meter\n* `square_meter` - Square Meter\n* `cubic_meter` - Cubic Meter\n* `hour` - Hour\n* `day` - Day\n* `month` - Month\n* `year` - Year\n* `box` - Box\n* `pack` - Pack\n* `dozen` - Dozen\n* `other` - Other"},"cost_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Cost price per unit"},"selling_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Selling price per unit"},"current_stock":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"minimum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"maximum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true},"status":{"enum":["active","inactive","discontinued","out_of_stock"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued\n* `out_of_stock` - Out of Stock"},"image":{"type":"string","format":"binary","nullable":true,"title":"Product Image","description":"Product image for catalogs and invoices"},"supplier_name":{"type":"string","nullable":true,"maxLength":300}}}}}}
```

## The PatchedQuoteRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"PatchedQuoteRequest":{"type":"object","description":"Comprehensive serializer for Quote model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string","minLength":1},"description":{"type":"string","nullable":true},"terms_and_conditions":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"quote_number":{"type":"string","minLength":1,"maxLength":100},"status":{"enum":["draft","sent","viewed","accepted","rejected","expired","converted"],"type":"string","description":"* `draft` - Draft\n* `sent` - Sent\n* `viewed` - Viewed by Client\n* `accepted` - Accepted\n* `rejected` - Rejected\n* `expired` - Expired\n* `converted` - Converted to Invoice"},"quote_date":{"type":"string","format":"date"},"valid_until":{"type":"string","format":"date","nullable":true},"client_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"items":{"type":"array","items":{"$ref":"#/components/schemas/QuoteItemRequest"}}}},"QuoteItemRequest":{"type":"object","description":"Serializer for quote line items.","properties":{"product_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"service_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"quantity":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"discount_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Discount %"},"vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"VAT Rate (%)","description":"VAT/tax rate percentage for this line item"},"currency":{"type":"string","minLength":1,"description":"Currency code (ISO 4217) for this line item","maxLength":3}},"required":["quantity","unit_price"]}}}}
```

## The PatchedSalesStageRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"PatchedSalesStageRequest":{"type":"object","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","minLength":1},"description":{"type":"string","nullable":true},"probability":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Win Probability %","description":"Probability of winning deals in this stage (0-100)"},"is_active":{"type":"boolean"},"is_closed_won":{"type":"boolean"},"is_closed_lost":{"type":"boolean"}}}}}}
```

## The PatchedServiceRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"PatchedServiceRequest":{"type":"object","description":"Full serializer for Service creation and updates.\nHandles translatable fields correctly.","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","nullable":true},"short_description":{"type":"string","nullable":true,"maxLength":500},"service_code":{"type":"string","nullable":true,"maxLength":100},"service_type":{"enum":["hourly","fixed","subscription","project","consultation","maintenance","other"],"type":"string","description":"Service type: hourly, fixed, subscription, project, consultation, maintenance, or other\n\n* `hourly` - Hourly Service\n* `fixed` - Fixed Price Service\n* `subscription` - Subscription Service\n* `project` - Project-based Service\n* `consultation` - Consultation Service\n* `maintenance` - Maintenance Service\n* `other` - Other"},"category":{"type":"string","nullable":true,"maxLength":200},"hourly_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Rate per hour for hourly services"},"fixed_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Fixed price for the service"},"billing_cycle":{"enum":["one_time","hourly","daily","weekly","monthly","quarterly","annually"],"type":"string","description":"* `one_time` - One Time\n* `hourly` - Hourly\n* `daily` - Daily\n* `weekly` - Weekly\n* `monthly` - Monthly\n* `quarterly` - Quarterly\n* `annually` - Annually"},"estimated_duration_hours":{"type":"string","format":"decimal","pattern":"^-?\\d{0,6}(?:\\.\\d{0,2})?$","nullable":true,"title":"Estimated Duration (Hours)","description":"Estimated time to complete the service"},"status":{"enum":["active","inactive","discontinued"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued"},"requirements":{"type":"string","nullable":true}}}}}}
```

## The PatchedVendorRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"PatchedVendorRequest":{"type":"object","description":"Comprehensive serializer for Vendor model.\nHandles multilingual fields, nested relationships, computed fields, and vendor-specific metrics.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","nullable":true},"entity_type":{"enum":["individual","company","non_profit","government","partnership","other"],"type":"string","description":"* `individual` - Individual\n* `company` - Company\n* `non_profit` - Non-Profit Organization\n* `government` - Government Entity\n* `partnership` - Partnership\n* `other` - Other"},"vendor_status":{"enum":["potential","active","preferred","on_hold","inactive","blacklisted"],"type":"string","description":"* `potential` - Potential Vendor\n* `active` - Active Vendor\n* `preferred` - Preferred Vendor\n* `on_hold` - On Hold\n* `inactive` - Inactive\n* `blacklisted` - Blacklisted"},"vendor_category":{"enum":["goods","services","both","contractor","consultant","other"],"type":"string","description":"* `goods` - Goods Supplier\n* `services` - Service Provider\n* `both` - Goods & Services\n* `contractor` - Contractor\n* `consultant` - Consultant\n* `other` - Other"},"industry":{"enum":["agriculture","cleaning","construction","consulting","creative","education","events","handyman","health","home_based","hospitality","it_support","legal","logistics","manufacturing","marketing","music","non_profit","online_retail","photography","printing","professional","travel","utilities","wholesale","writing","virtual_assistance","other","",null],"type":"string","description":"* `agriculture` - Agriculture and Farming\n* `cleaning` - Cleaning Services\n* `construction` - Construction and Real Estate Services\n* `consulting` - Consulting and Freelancing\n* `creative` - Creative and Design Services\n* `education` - Education and Tutoring Services\n* `events` - Entertainment and Events Planning\n* `handyman` - Handyman and Home Repair Services\n* `health` - Health and Wellness\n* `home_based` - Home-Based Businesses\n* `hospitality` - Hospitality and Tourism\n* `it_support` - IT and Software Support Services\n* `legal` - Legal and Financial Services\n* `logistics` - Logistics and Delivery Services\n* `manufacturing` - Manufacturing and Small-Scale Production\n* `marketing` - Marketing and Advertising Services\n* `music` - Music and Entertainment Services\n* `non_profit` - Non-Profit and Social Enterprises\n* `online_retail` - Online Retail and E-commerce\n* `photography` - Photography and Videography Services\n* `printing` - Printing and Copy Services\n* `professional` - Professional Services\n* `travel` - Travel Agencies\n* `utilities` - Utilities and Renewable Energy Services\n* `wholesale` - Wholesale and Distribution\n* `writing` - Writing and Editing Services\n* `virtual_assistance` - Virtual Assistance and Admin Support\n* `other` - Other","nullable":true},"website":{"type":"string","format":"uri","nullable":true,"maxLength":300},"company_size":{"type":"string","nullable":true,"maxLength":100},"annual_revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Annual revenue in USD"},"minimum_order_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Minimum order amount required"},"default_currency":{"type":"string","minLength":1,"description":"Default currency code (ISO 4217) for this entity's transactions","maxLength":3},"first_contact_date":{"type":"string","format":"date","nullable":true},"last_contact_date":{"type":"string","format":"date","nullable":true},"next_follow_up_date":{"type":"string","format":"date","nullable":true},"last_order_date":{"type":"string","format":"date","nullable":true},"contract_start_date":{"type":"string","format":"date","nullable":true},"contract_end_date":{"type":"string","format":"date","nullable":true},"quality_rating":{"type":"string","format":"decimal","pattern":"^-?\\d{0,1}(?:\\.\\d{0,2})?$","nullable":true,"description":"Quality rating out of 5.00"},"delivery_rating":{"type":"string","format":"decimal","pattern":"^-?\\d{0,1}(?:\\.\\d{0,2})?$","nullable":true,"description":"Delivery performance rating out of 5.00"},"address":{"allOf":[{"$ref":"#/components/schemas/ClientAddressRequest"}],"nullable":true},"banking_information":{"allOf":[{"$ref":"#/components/schemas/ClientBankingInformationRequest"}],"nullable":true}}},"ClientAddressRequest":{"type":"object","description":"Serializer for Address model.\nCountry field is explicitly defined as CharField to handle django-countries CountryField.","properties":{"address_line_1":{"type":"string","nullable":true,"maxLength":300},"address_line_2":{"type":"string","nullable":true,"maxLength":300},"city":{"type":"string","nullable":true,"maxLength":300},"province_state":{"type":"string","nullable":true,"title":"Province/State","maxLength":300},"postal_code":{"type":"string","nullable":true,"maxLength":300},"country":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true,"title":"Phone Number","pattern":"^\\+?1?\\d{9,15}$","maxLength":17}}},"ClientBankingInformationRequest":{"type":"object","description":"Serializer for BankingInformation model with all banking fields.","properties":{"bank_name":{"type":"string","nullable":true,"maxLength":200},"account_number":{"type":"string","nullable":true,"maxLength":100},"branch_code":{"type":"string","nullable":true,"maxLength":50},"account_type":{"enum":["checking","savings","business","other","",null],"type":"string","description":"* `checking` - Checking\n* `savings` - Savings\n* `business` - Business\n* `other` - Other","nullable":true},"routing_number":{"type":"string","nullable":true,"maxLength":50},"swift_code":{"type":"string","nullable":true,"maxLength":50}}}}}}
```

## The Person object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"Person":{"type":"object","description":"Person model with nested user information and related data.\nSupports reading + writing nested Address/Employee/Banking.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"user":{"allOf":[{"$ref":"#/components/schemas/User"}],"readOnly":true},"current_language":{"enum":["en","sw","de","es","hi","ar","ko","pt","af","el","fr","ta","ru","zh-hans"],"type":"string","description":"* `en` - English\n* `sw` - Swahili\n* `de` - German\n* `es` - Spanish\n* `hi` - Hindi\n* `ar` - Arabic\n* `ko` - Korean\n* `pt` - Portuguese\n* `af` - Afrikaans\n* `el` - Greek\n* `fr` - French\n* `ta` - Tamil\n* `ru` - Russian\n* `zh-hans` - Simplified Chinese"},"language_display":{"type":"string","readOnly":true},"profile_picture_url":{"type":"string","format":"uri","nullable":true,"readOnly":true},"job_title":{"type":"string","nullable":true,"maxLength":300},"is_owner":{"type":"boolean"},"user_type":{"enum":["user","employee"],"type":"string","description":"* `user` - Regular User\n* `employee` - Employee"},"user_type_display":{"type":"string","readOnly":true},"organisation_details":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"address":{"allOf":[{"$ref":"#/components/schemas/Address"}],"nullable":true},"banking_information":{"allOf":[{"$ref":"#/components/schemas/BankingInformation"}],"nullable":true},"employee_information":{"allOf":[{"$ref":"#/components/schemas/EmployeeInformation"}],"nullable":true},"last_login":{"type":"string","format":"date-time","nullable":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["language_display","organisation_details","profile_picture_url","user","user_type_display"]},"User":{"type":"object","properties":{"first_name":{"type":"string","readOnly":true},"last_name":{"type":"string","readOnly":true},"email":{"type":"string","format":"email","readOnly":true,"title":"Email address"}},"required":["email","first_name","last_name"]},"Address":{"type":"object","description":"Serializer for Address model with essential location fields.","properties":{"address_line_1":{"type":"string","nullable":true,"maxLength":300},"city":{"type":"string","nullable":true,"maxLength":300},"province_state":{"type":"string","nullable":true,"title":"Province/State","maxLength":300},"postal_code":{"type":"string","nullable":true,"maxLength":300},"country_name":{"type":"string","readOnly":true}},"required":["country_name"]},"BankingInformation":{"type":"object","description":"Serializer for BankingInformation with PII hygiene:\n- `account_number` is write-only\n- expose masked `account_number_last4` for reads","properties":{"bank_name":{"type":"string","nullable":true,"maxLength":200},"account_number_last4":{"type":"string","nullable":true,"readOnly":true},"branch_code":{"type":"string","nullable":true,"maxLength":50},"account_type":{"enum":["checking","savings","business","other","",null],"type":"string","description":"* `checking` - Checking\n* `savings` - Savings\n* `business` - Business\n* `other` - Other","nullable":true},"routing_number":{"type":"string","nullable":true,"maxLength":50},"swift_code":{"type":"string","nullable":true,"maxLength":50},"date_created":{"type":"string","format":"date-time","readOnly":true},"last_updated":{"type":"string","format":"date-time","readOnly":true},"account_type_display":{"type":"string","readOnly":true}},"required":["account_number_last4","account_type_display","date_created","last_updated"]},"EmployeeInformation":{"type":"object","description":"Serializer for EmployeeInformation with complete employee data.","properties":{"id_number":{"type":"string","nullable":true,"maxLength":100},"employee_number":{"type":"string","nullable":true,"maxLength":100},"tax_number":{"type":"string","nullable":true,"maxLength":100},"phone_number":{"type":"string","nullable":true,"maxLength":200},"birthday":{"type":"string","format":"date","nullable":true},"linkedin_url":{"type":"string","format":"uri","nullable":true,"title":"LinkedIn Profile","maxLength":300},"emergency_contact":{"type":"string","nullable":true,"maxLength":300},"emergency_phone":{"type":"string","nullable":true,"maxLength":200},"medical_aid_number":{"type":"string","nullable":true,"maxLength":300},"medical_aid_provider":{"type":"string","nullable":true,"maxLength":300},"medical_aid_plan":{"type":"string","nullable":true,"maxLength":300},"medical_conditions":{"type":"string","nullable":true},"allergies":{"type":"string","nullable":true},"medications":{"type":"string","nullable":true},"start_date":{"type":"string","format":"date","nullable":true},"end_date":{"type":"string","format":"date","nullable":true},"is_active_employee":{"type":"boolean"},"date_created":{"type":"string","format":"date-time","readOnly":true},"last_updated":{"type":"string","format":"date-time","readOnly":true}},"required":["date_created","last_updated"]}}}}
```

## The PersonRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"PersonRequest":{"type":"object","description":"Person model with nested user information and related data.\nSupports reading + writing nested Address/Employee/Banking.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"current_language":{"enum":["en","sw","de","es","hi","ar","ko","pt","af","el","fr","ta","ru","zh-hans"],"type":"string","description":"* `en` - English\n* `sw` - Swahili\n* `de` - German\n* `es` - Spanish\n* `hi` - Hindi\n* `ar` - Arabic\n* `ko` - Korean\n* `pt` - Portuguese\n* `af` - Afrikaans\n* `el` - Greek\n* `fr` - French\n* `ta` - Tamil\n* `ru` - Russian\n* `zh-hans` - Simplified Chinese"},"job_title":{"type":"string","nullable":true,"maxLength":300},"is_owner":{"type":"boolean"},"user_type":{"enum":["user","employee"],"type":"string","description":"* `user` - Regular User\n* `employee` - Employee"},"address":{"allOf":[{"$ref":"#/components/schemas/AddressRequest"}],"nullable":true},"banking_information":{"allOf":[{"$ref":"#/components/schemas/BankingInformationRequest"}],"nullable":true},"employee_information":{"allOf":[{"$ref":"#/components/schemas/EmployeeInformationRequest"}],"nullable":true},"last_login":{"type":"string","format":"date-time","nullable":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}}},"AddressRequest":{"type":"object","description":"Serializer for Address model with essential location fields.","properties":{"address_line_1":{"type":"string","nullable":true,"maxLength":300},"city":{"type":"string","nullable":true,"maxLength":300},"province_state":{"type":"string","nullable":true,"title":"Province/State","maxLength":300},"postal_code":{"type":"string","nullable":true,"maxLength":300}}},"BankingInformationRequest":{"type":"object","description":"Serializer for BankingInformation with PII hygiene:\n- `account_number` is write-only\n- expose masked `account_number_last4` for reads","properties":{"bank_name":{"type":"string","nullable":true,"maxLength":200},"account_number":{"type":"string","writeOnly":true},"branch_code":{"type":"string","nullable":true,"maxLength":50},"account_type":{"enum":["checking","savings","business","other","",null],"type":"string","description":"* `checking` - Checking\n* `savings` - Savings\n* `business` - Business\n* `other` - Other","nullable":true},"routing_number":{"type":"string","nullable":true,"maxLength":50},"swift_code":{"type":"string","nullable":true,"maxLength":50}}},"EmployeeInformationRequest":{"type":"object","description":"Serializer for EmployeeInformation with complete employee data.","properties":{"id_number":{"type":"string","nullable":true,"maxLength":100},"employee_number":{"type":"string","nullable":true,"maxLength":100},"tax_number":{"type":"string","nullable":true,"maxLength":100},"phone_number":{"type":"string","nullable":true,"maxLength":200},"birthday":{"type":"string","format":"date","nullable":true},"linkedin_url":{"type":"string","format":"uri","nullable":true,"title":"LinkedIn Profile","maxLength":300},"emergency_contact":{"type":"string","nullable":true,"maxLength":300},"emergency_phone":{"type":"string","nullable":true,"maxLength":200},"medical_aid_number":{"type":"string","nullable":true,"maxLength":300},"medical_aid_provider":{"type":"string","nullable":true,"maxLength":300},"medical_aid_plan":{"type":"string","nullable":true,"maxLength":300},"medical_conditions":{"type":"string","nullable":true},"allergies":{"type":"string","nullable":true},"medications":{"type":"string","nullable":true},"start_date":{"type":"string","format":"date","nullable":true},"end_date":{"type":"string","format":"date","nullable":true},"is_active_employee":{"type":"boolean"}}}}}}
```

## The ProductDetail object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ProductDetail":{"type":"object","description":"Detailed serializer for single product retrieval.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true},"short_description":{"type":"string","readOnly":true},"product_code":{"type":"string","nullable":true,"maxLength":100},"barcode":{"type":"string","nullable":true,"maxLength":100},"product_type":{"enum":["manufacture","buy"],"type":"string","description":"* `manufacture` - Manufacture\n* `buy` - Buy"},"category":{"type":"string","nullable":true,"maxLength":200},"brand":{"type":"string","nullable":true,"maxLength":200},"model_number":{"type":"string","nullable":true,"maxLength":200},"unit_of_measure":{"enum":["piece","kg","gram","liter","meter","square_meter","cubic_meter","hour","day","month","year","box","pack","dozen","other"],"type":"string","description":"* `piece` - Piece\n* `kg` - Kilogram\n* `gram` - Gram\n* `liter` - Liter\n* `meter` - Meter\n* `square_meter` - Square Meter\n* `cubic_meter` - Cubic Meter\n* `hour` - Hour\n* `day` - Day\n* `month` - Month\n* `year` - Year\n* `box` - Box\n* `pack` - Pack\n* `dozen` - Dozen\n* `other` - Other"},"cost_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Cost price per unit"},"selling_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Selling price per unit"},"current_stock":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"minimum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"maximum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true},"status":{"enum":["active","inactive","discontinued","out_of_stock"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued\n* `out_of_stock` - Out of Stock"},"image_url":{"type":"string","format":"uri","nullable":true,"readOnly":true},"supplier_name":{"type":"string","nullable":true,"maxLength":300},"created_by":{"allOf":[{"$ref":"#/components/schemas/ProductPersonMini"}],"readOnly":true},"is_low_stock":{"type":"boolean","readOnly":true},"profit_margin":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","nullable":true,"readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["created_by","description","image_url","is_low_stock","name","profit_margin","short_description"]},"ProductPersonMini":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","nullable":true,"readOnly":true}},"required":["full_name"]}}}}
```

## The ProductList object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ProductList":{"type":"object","description":"Lightweight serializer for product lists.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"short_description":{"type":"string","readOnly":true},"product_code":{"type":"string","nullable":true,"maxLength":100},"barcode":{"type":"string","nullable":true,"maxLength":100},"product_type":{"enum":["manufacture","buy"],"type":"string","description":"* `manufacture` - Manufacture\n* `buy` - Buy"},"category":{"type":"string","nullable":true,"maxLength":200},"brand":{"type":"string","nullable":true,"maxLength":200},"selling_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Selling price per unit"},"current_stock":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"minimum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_of_measure":{"enum":["piece","kg","gram","liter","meter","square_meter","cubic_meter","hour","day","month","year","box","pack","dozen","other"],"type":"string","description":"* `piece` - Piece\n* `kg` - Kilogram\n* `gram` - Gram\n* `liter` - Liter\n* `meter` - Meter\n* `square_meter` - Square Meter\n* `cubic_meter` - Cubic Meter\n* `hour` - Hour\n* `day` - Day\n* `month` - Month\n* `year` - Year\n* `box` - Box\n* `pack` - Pack\n* `dozen` - Dozen\n* `other` - Other"},"status":{"enum":["active","inactive","discontinued","out_of_stock"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued\n* `out_of_stock` - Out of Stock"},"is_low_stock":{"type":"boolean","readOnly":true},"image_url":{"type":"string","format":"uri","nullable":true,"readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true}},"required":["image_url","is_low_stock","name","short_description"]}}}}
```

## The ProductPersonMini object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ProductPersonMini":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","nullable":true,"readOnly":true}},"required":["full_name"]}}}}
```

## The ProductPersonMiniRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ProductPersonMiniRequest":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100}}}}}}
```

## The ProductRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ProductRequest":{"type":"object","description":"Full serializer for Product creation and updates.\nHandles translatable fields correctly.","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","nullable":true},"short_description":{"type":"string","nullable":true,"maxLength":500},"product_code":{"type":"string","nullable":true,"maxLength":100},"barcode":{"type":"string","nullable":true,"maxLength":100},"product_type":{"enum":["manufacture","buy"],"type":"string","description":"Product type is required.\n\n* `manufacture` - Manufacture\n* `buy` - Buy"},"category":{"type":"string","nullable":true,"maxLength":200},"brand":{"type":"string","nullable":true,"maxLength":200},"model_number":{"type":"string","nullable":true,"maxLength":200},"unit_of_measure":{"enum":["piece","kg","gram","liter","meter","square_meter","cubic_meter","hour","day","month","year","box","pack","dozen","other"],"type":"string","description":"* `piece` - Piece\n* `kg` - Kilogram\n* `gram` - Gram\n* `liter` - Liter\n* `meter` - Meter\n* `square_meter` - Square Meter\n* `cubic_meter` - Cubic Meter\n* `hour` - Hour\n* `day` - Day\n* `month` - Month\n* `year` - Year\n* `box` - Box\n* `pack` - Pack\n* `dozen` - Dozen\n* `other` - Other"},"cost_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Cost price per unit"},"selling_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Selling price per unit"},"current_stock":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"minimum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"maximum_stock_level":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true},"status":{"enum":["active","inactive","discontinued","out_of_stock"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued\n* `out_of_stock` - Out of Stock"},"image":{"type":"string","format":"binary","nullable":true,"title":"Product Image","description":"Product image for catalogs and invoices"},"supplier_name":{"type":"string","nullable":true,"maxLength":300}},"required":["name","product_type"]}}}}
```

## The Quote object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"Quote":{"type":"object","description":"Comprehensive serializer for Quote model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string"},"description":{"type":"string","nullable":true},"terms_and_conditions":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"quote_number":{"type":"string","maxLength":100},"status":{"enum":["draft","sent","viewed","accepted","rejected","expired","converted"],"type":"string","description":"* `draft` - Draft\n* `sent` - Sent\n* `viewed` - Viewed by Client\n* `accepted` - Accepted\n* `rejected` - Rejected\n* `expired` - Expired\n* `converted` - Converted to Invoice"},"status_display":{"type":"string","readOnly":true},"quote_date":{"type":"string","format":"date"},"valid_until":{"type":"string","format":"date","nullable":true},"sent_date":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Calculated from line items"},"total_tax_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Total VAT/tax from all line items"},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Subtotal + Total Tax Amount"},"is_expired":{"type":"boolean","readOnly":true},"currency":{"type":"string","readOnly":true},"client":{"allOf":[{"$ref":"#/components/schemas/FinanceClientMini"}],"readOnly":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/QuoteItem"}},"created_by":{"allOf":[{"$ref":"#/components/schemas/FinancePersonMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"last_updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["client","created_by","currency","date_created","is_expired","last_updated","quote_number","sent_date","status_display","subtotal","title","total_amount","total_tax_amount"]},"FinanceClientMini":{"type":"object","description":"Lightweight serializer for Client model.\nUsed for nested client references in invoices and quotes.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"entity_type":{"enum":["individual","company","non_profit","government","partnership","other"],"type":"string","description":"* `individual` - Individual\n* `company` - Company\n* `non_profit` - Non-Profit Organization\n* `government` - Government Entity\n* `partnership` - Partnership\n* `other` - Other"}},"required":["name"]},"QuoteItem":{"type":"object","description":"Serializer for quote line items.","properties":{"item_name":{"type":"string","readOnly":true},"quantity":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"discount_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Discount %"},"vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"VAT Rate (%)","description":"VAT/tax rate percentage for this line item"},"currency":{"type":"string","description":"Currency code (ISO 4217) for this line item","maxLength":3},"line_subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_vat_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_total":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true}},"required":["item_name","line_subtotal","line_total","line_vat_amount","quantity","unit_price"]},"FinancePersonMini":{"type":"object","description":"Lightweight serializer for Person model.\nUsed for nested person references in financial documents.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","readOnly":true}},"required":["full_name"]}}}}
```

## The QuoteItem object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"QuoteItem":{"type":"object","description":"Serializer for quote line items.","properties":{"item_name":{"type":"string","readOnly":true},"quantity":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"discount_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Discount %"},"vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"VAT Rate (%)","description":"VAT/tax rate percentage for this line item"},"currency":{"type":"string","description":"Currency code (ISO 4217) for this line item","maxLength":3},"line_subtotal":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_vat_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true},"line_total":{"type":"string","format":"decimal","pattern":"^-?\\d{0,10}(?:\\.\\d{0,2})?$","readOnly":true}},"required":["item_name","line_subtotal","line_total","line_vat_amount","quantity","unit_price"]}}}}
```

## The QuoteItemRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"QuoteItemRequest":{"type":"object","description":"Serializer for quote line items.","properties":{"product_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"service_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"quantity":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"discount_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Discount %"},"vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"VAT Rate (%)","description":"VAT/tax rate percentage for this line item"},"currency":{"type":"string","minLength":1,"description":"Currency code (ISO 4217) for this line item","maxLength":3}},"required":["quantity","unit_price"]}}}}
```

## The QuoteList object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"QuoteList":{"type":"object","description":"Lightweight version for list views.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string"},"quote_number":{"type":"string","maxLength":100},"status":{"enum":["draft","sent","viewed","accepted","rejected","expired","converted"],"type":"string","description":"* `draft` - Draft\n* `sent` - Sent\n* `viewed` - Viewed by Client\n* `accepted` - Accepted\n* `rejected` - Rejected\n* `expired` - Expired\n* `converted` - Converted to Invoice"},"status_display":{"type":"string","readOnly":true},"quote_date":{"type":"string","format":"date"},"valid_until":{"type":"string","format":"date","nullable":true},"total_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","readOnly":true,"description":"Subtotal + Total Tax Amount"},"is_expired":{"type":"boolean","readOnly":true},"currency":{"type":"string","readOnly":true},"client":{"allOf":[{"$ref":"#/components/schemas/FinanceClientMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["client","currency","date_created","is_expired","quote_number","status_display","title","total_amount"]},"FinanceClientMini":{"type":"object","description":"Lightweight serializer for Client model.\nUsed for nested client references in invoices and quotes.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"entity_type":{"enum":["individual","company","non_profit","government","partnership","other"],"type":"string","description":"* `individual` - Individual\n* `company` - Company\n* `non_profit` - Non-Profit Organization\n* `government` - Government Entity\n* `partnership` - Partnership\n* `other` - Other"}},"required":["name"]}}}}
```

## The QuoteRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"QuoteRequest":{"type":"object","description":"Comprehensive serializer for Quote model.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"title":{"type":"string","minLength":1},"description":{"type":"string","nullable":true},"terms_and_conditions":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"quote_number":{"type":"string","minLength":1,"maxLength":100},"status":{"enum":["draft","sent","viewed","accepted","rejected","expired","converted"],"type":"string","description":"* `draft` - Draft\n* `sent` - Sent\n* `viewed` - Viewed by Client\n* `accepted` - Accepted\n* `rejected` - Rejected\n* `expired` - Expired\n* `converted` - Converted to Invoice"},"quote_date":{"type":"string","format":"date"},"valid_until":{"type":"string","format":"date","nullable":true},"client_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"items":{"type":"array","items":{"$ref":"#/components/schemas/QuoteItemRequest"}}},"required":["quote_number","title"]},"QuoteItemRequest":{"type":"object","description":"Serializer for quote line items.","properties":{"product_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"service_id":{"type":"string","writeOnly":true,"nullable":true,"minLength":1},"quantity":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"unit_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$"},"discount_percentage":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Discount %"},"vat_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"VAT Rate (%)","description":"VAT/tax rate percentage for this line item"},"currency":{"type":"string","minLength":1,"description":"Currency code (ISO 4217) for this line item","maxLength":3}},"required":["quantity","unit_price"]}}}}
```

## The SalesStage object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"SalesStage":{"type":"object","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string"},"description":{"type":"string","nullable":true},"probability":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Win Probability %","description":"Probability of winning deals in this stage (0-100)"},"is_active":{"type":"boolean"},"is_closed_won":{"type":"boolean"},"is_closed_lost":{"type":"boolean"},"date_created":{"type":"string","format":"date-time","readOnly":true},"last_updated":{"type":"string","format":"date-time","readOnly":true}},"required":["date_created","last_updated","name"]}}}}
```

## The SalesStageRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"SalesStageRequest":{"type":"object","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","minLength":1},"description":{"type":"string","nullable":true},"probability":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","title":"Win Probability %","description":"Probability of winning deals in this stage (0-100)"},"is_active":{"type":"boolean"},"is_closed_won":{"type":"boolean"},"is_closed_lost":{"type":"boolean"}},"required":["name"]}}}}
```

## The ServiceDetail object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ServiceDetail":{"type":"object","description":"Detailed serializer for single service retrieval.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true},"short_description":{"type":"string","readOnly":true},"service_code":{"type":"string","nullable":true,"maxLength":100},"service_type":{"enum":["hourly","fixed","subscription","project","consultation","maintenance","other"],"type":"string","description":"* `hourly` - Hourly Service\n* `fixed` - Fixed Price Service\n* `subscription` - Subscription Service\n* `project` - Project-based Service\n* `consultation` - Consultation Service\n* `maintenance` - Maintenance Service\n* `other` - Other"},"category":{"type":"string","nullable":true,"maxLength":200},"hourly_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Rate per hour for hourly services"},"fixed_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Fixed price for the service"},"effective_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","nullable":true,"readOnly":true},"billing_cycle":{"enum":["one_time","hourly","daily","weekly","monthly","quarterly","annually"],"type":"string","description":"* `one_time` - One Time\n* `hourly` - Hourly\n* `daily` - Daily\n* `weekly` - Weekly\n* `monthly` - Monthly\n* `quarterly` - Quarterly\n* `annually` - Annually"},"estimated_duration_hours":{"type":"string","format":"decimal","pattern":"^-?\\d{0,6}(?:\\.\\d{0,2})?$","nullable":true,"title":"Estimated Duration (Hours)","description":"Estimated time to complete the service"},"status":{"enum":["active","inactive","discontinued"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued"},"requirements":{"type":"string","nullable":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/ServicePersonMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["created_by","description","effective_rate","name","short_description"]},"ServicePersonMini":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","nullable":true,"readOnly":true}},"required":["full_name"]}}}}
```

## The ServiceList object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ServiceList":{"type":"object","description":"Lightweight serializer for service lists.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"short_description":{"type":"string","readOnly":true},"service_code":{"type":"string","nullable":true,"maxLength":100},"service_type":{"enum":["hourly","fixed","subscription","project","consultation","maintenance","other"],"type":"string","description":"* `hourly` - Hourly Service\n* `fixed` - Fixed Price Service\n* `subscription` - Subscription Service\n* `project` - Project-based Service\n* `consultation` - Consultation Service\n* `maintenance` - Maintenance Service\n* `other` - Other"},"category":{"type":"string","nullable":true,"maxLength":200},"hourly_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Rate per hour for hourly services"},"fixed_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Fixed price for the service"},"effective_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","nullable":true,"readOnly":true},"billing_cycle":{"enum":["one_time","hourly","daily","weekly","monthly","quarterly","annually"],"type":"string","description":"* `one_time` - One Time\n* `hourly` - Hourly\n* `daily` - Daily\n* `weekly` - Weekly\n* `monthly` - Monthly\n* `quarterly` - Quarterly\n* `annually` - Annually"},"status":{"enum":["active","inactive","discontinued"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued"},"date_created":{"type":"string","format":"date-time","nullable":true}},"required":["effective_rate","name","short_description"]}}}}
```

## The ServicePersonMini object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ServicePersonMini":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","nullable":true,"readOnly":true}},"required":["full_name"]}}}}
```

## The ServicePersonMiniRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ServicePersonMiniRequest":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100}}}}}}
```

## The ServiceRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"ServiceRequest":{"type":"object","description":"Full serializer for Service creation and updates.\nHandles translatable fields correctly.","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","nullable":true},"short_description":{"type":"string","nullable":true,"maxLength":500},"service_code":{"type":"string","nullable":true,"maxLength":100},"service_type":{"enum":["hourly","fixed","subscription","project","consultation","maintenance","other"],"type":"string","description":"Service type: hourly, fixed, subscription, project, consultation, maintenance, or other\n\n* `hourly` - Hourly Service\n* `fixed` - Fixed Price Service\n* `subscription` - Subscription Service\n* `project` - Project-based Service\n* `consultation` - Consultation Service\n* `maintenance` - Maintenance Service\n* `other` - Other"},"category":{"type":"string","nullable":true,"maxLength":200},"hourly_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Rate per hour for hourly services"},"fixed_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Fixed price for the service"},"billing_cycle":{"enum":["one_time","hourly","daily","weekly","monthly","quarterly","annually"],"type":"string","description":"* `one_time` - One Time\n* `hourly` - Hourly\n* `daily` - Daily\n* `weekly` - Weekly\n* `monthly` - Monthly\n* `quarterly` - Quarterly\n* `annually` - Annually"},"estimated_duration_hours":{"type":"string","format":"decimal","pattern":"^-?\\d{0,6}(?:\\.\\d{0,2})?$","nullable":true,"title":"Estimated Duration (Hours)","description":"Estimated time to complete the service"},"status":{"enum":["active","inactive","discontinued"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued"},"requirements":{"type":"string","nullable":true}},"required":["name","service_type"]}}}}
```

## The User object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"User":{"type":"object","properties":{"first_name":{"type":"string","readOnly":true},"last_name":{"type":"string","readOnly":true},"email":{"type":"string","format":"email","readOnly":true,"title":"Email address"}},"required":["email","first_name","last_name"]}}}}
```

## The Vendor object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"Vendor":{"type":"object","description":"Comprehensive serializer for Vendor model.\nHandles multilingual fields, nested relationships, computed fields, and vendor-specific metrics.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","maxLength":300},"description":{"type":"string","nullable":true},"entity_type":{"enum":["individual","company","non_profit","government","partnership","other"],"type":"string","description":"* `individual` - Individual\n* `company` - Company\n* `non_profit` - Non-Profit Organization\n* `government` - Government Entity\n* `partnership` - Partnership\n* `other` - Other"},"entity_type_display":{"type":"string","nullable":true,"readOnly":true},"vendor_status":{"enum":["potential","active","preferred","on_hold","inactive","blacklisted"],"type":"string","description":"* `potential` - Potential Vendor\n* `active` - Active Vendor\n* `preferred` - Preferred Vendor\n* `on_hold` - On Hold\n* `inactive` - Inactive\n* `blacklisted` - Blacklisted"},"vendor_status_display":{"type":"string","nullable":true,"readOnly":true},"vendor_category":{"enum":["goods","services","both","contractor","consultant","other"],"type":"string","description":"* `goods` - Goods Supplier\n* `services` - Service Provider\n* `both` - Goods & Services\n* `contractor` - Contractor\n* `consultant` - Consultant\n* `other` - Other"},"vendor_category_display":{"type":"string","nullable":true,"readOnly":true},"industry":{"enum":["agriculture","cleaning","construction","consulting","creative","education","events","handyman","health","home_based","hospitality","it_support","legal","logistics","manufacturing","marketing","music","non_profit","online_retail","photography","printing","professional","travel","utilities","wholesale","writing","virtual_assistance","other","",null],"type":"string","description":"* `agriculture` - Agriculture and Farming\n* `cleaning` - Cleaning Services\n* `construction` - Construction and Real Estate Services\n* `consulting` - Consulting and Freelancing\n* `creative` - Creative and Design Services\n* `education` - Education and Tutoring Services\n* `events` - Entertainment and Events Planning\n* `handyman` - Handyman and Home Repair Services\n* `health` - Health and Wellness\n* `home_based` - Home-Based Businesses\n* `hospitality` - Hospitality and Tourism\n* `it_support` - IT and Software Support Services\n* `legal` - Legal and Financial Services\n* `logistics` - Logistics and Delivery Services\n* `manufacturing` - Manufacturing and Small-Scale Production\n* `marketing` - Marketing and Advertising Services\n* `music` - Music and Entertainment Services\n* `non_profit` - Non-Profit and Social Enterprises\n* `online_retail` - Online Retail and E-commerce\n* `photography` - Photography and Videography Services\n* `printing` - Printing and Copy Services\n* `professional` - Professional Services\n* `travel` - Travel Agencies\n* `utilities` - Utilities and Renewable Energy Services\n* `wholesale` - Wholesale and Distribution\n* `writing` - Writing and Editing Services\n* `virtual_assistance` - Virtual Assistance and Admin Support\n* `other` - Other","nullable":true},"industry_display":{"type":"string","nullable":true,"readOnly":true},"website":{"type":"string","format":"uri","nullable":true,"maxLength":300},"company_size":{"type":"string","nullable":true,"maxLength":100},"annual_revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Annual revenue in USD"},"minimum_order_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Minimum order amount required"},"default_currency":{"type":"string","description":"Default currency code (ISO 4217) for this entity's transactions","maxLength":3},"first_contact_date":{"type":"string","format":"date","nullable":true},"last_contact_date":{"type":"string","format":"date","nullable":true},"next_follow_up_date":{"type":"string","format":"date","nullable":true},"last_order_date":{"type":"string","format":"date","nullable":true},"contract_start_date":{"type":"string","format":"date","nullable":true},"contract_end_date":{"type":"string","format":"date","nullable":true},"quality_rating":{"type":"string","format":"decimal","pattern":"^-?\\d{0,1}(?:\\.\\d{0,2})?$","nullable":true,"description":"Quality rating out of 5.00"},"delivery_rating":{"type":"string","format":"decimal","pattern":"^-?\\d{0,1}(?:\\.\\d{0,2})?$","nullable":true,"description":"Delivery performance rating out of 5.00"},"created_by":{"allOf":[{"$ref":"#/components/schemas/ClientPersonMini"}],"readOnly":true},"assigned_to":{"allOf":[{"$ref":"#/components/schemas/ClientPersonMini"}],"readOnly":true},"account_owner":{"allOf":[{"$ref":"#/components/schemas/ClientPersonMini"}],"readOnly":true},"address":{"allOf":[{"$ref":"#/components/schemas/ClientAddress"}],"nullable":true},"banking_information":{"allOf":[{"$ref":"#/components/schemas/ClientBankingInformation"}],"nullable":true},"days_since_last_contact":{"type":"integer","nullable":true,"readOnly":true},"days_since_last_order":{"type":"integer","nullable":true,"readOnly":true},"is_follow_up_overdue":{"type":"boolean","readOnly":true},"is_contract_active":{"type":"boolean","readOnly":true},"date_created":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"last_updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["account_owner","assigned_to","created_by","date_created","days_since_last_contact","days_since_last_order","entity_type_display","industry_display","is_contract_active","is_follow_up_overdue","last_updated","name","vendor_category_display","vendor_status_display"]},"ClientPersonMini":{"type":"object","description":"Lightweight serializer for Person model.\nUsed for nested person references in other serializers.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","readOnly":true}},"required":["full_name"]},"ClientAddress":{"type":"object","description":"Serializer for Address model.\nCountry field is explicitly defined as CharField to handle django-countries CountryField.","properties":{"address_line_1":{"type":"string","nullable":true,"maxLength":300},"address_line_2":{"type":"string","nullable":true,"maxLength":300},"city":{"type":"string","nullable":true,"maxLength":300},"province_state":{"type":"string","nullable":true,"title":"Province/State","maxLength":300},"postal_code":{"type":"string","nullable":true,"maxLength":300},"country":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true,"title":"Phone Number","pattern":"^\\+?1?\\d{9,15}$","maxLength":17}}},"ClientBankingInformation":{"type":"object","description":"Serializer for BankingInformation model with all banking fields.","properties":{"bank_name":{"type":"string","nullable":true,"maxLength":200},"account_number":{"type":"string","nullable":true,"maxLength":100},"branch_code":{"type":"string","nullable":true,"maxLength":50},"account_type":{"enum":["checking","savings","business","other","",null],"type":"string","description":"* `checking` - Checking\n* `savings` - Savings\n* `business` - Business\n* `other` - Other","nullable":true},"routing_number":{"type":"string","nullable":true,"maxLength":50},"swift_code":{"type":"string","nullable":true,"maxLength":50}}}}}}
```

## The VendorRequest object

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"components":{"schemas":{"VendorRequest":{"type":"object","description":"Comprehensive serializer for Vendor model.\nHandles multilingual fields, nested relationships, computed fields, and vendor-specific metrics.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","nullable":true},"entity_type":{"enum":["individual","company","non_profit","government","partnership","other"],"type":"string","description":"* `individual` - Individual\n* `company` - Company\n* `non_profit` - Non-Profit Organization\n* `government` - Government Entity\n* `partnership` - Partnership\n* `other` - Other"},"vendor_status":{"enum":["potential","active","preferred","on_hold","inactive","blacklisted"],"type":"string","description":"* `potential` - Potential Vendor\n* `active` - Active Vendor\n* `preferred` - Preferred Vendor\n* `on_hold` - On Hold\n* `inactive` - Inactive\n* `blacklisted` - Blacklisted"},"vendor_category":{"enum":["goods","services","both","contractor","consultant","other"],"type":"string","description":"* `goods` - Goods Supplier\n* `services` - Service Provider\n* `both` - Goods & Services\n* `contractor` - Contractor\n* `consultant` - Consultant\n* `other` - Other"},"industry":{"enum":["agriculture","cleaning","construction","consulting","creative","education","events","handyman","health","home_based","hospitality","it_support","legal","logistics","manufacturing","marketing","music","non_profit","online_retail","photography","printing","professional","travel","utilities","wholesale","writing","virtual_assistance","other","",null],"type":"string","description":"* `agriculture` - Agriculture and Farming\n* `cleaning` - Cleaning Services\n* `construction` - Construction and Real Estate Services\n* `consulting` - Consulting and Freelancing\n* `creative` - Creative and Design Services\n* `education` - Education and Tutoring Services\n* `events` - Entertainment and Events Planning\n* `handyman` - Handyman and Home Repair Services\n* `health` - Health and Wellness\n* `home_based` - Home-Based Businesses\n* `hospitality` - Hospitality and Tourism\n* `it_support` - IT and Software Support Services\n* `legal` - Legal and Financial Services\n* `logistics` - Logistics and Delivery Services\n* `manufacturing` - Manufacturing and Small-Scale Production\n* `marketing` - Marketing and Advertising Services\n* `music` - Music and Entertainment Services\n* `non_profit` - Non-Profit and Social Enterprises\n* `online_retail` - Online Retail and E-commerce\n* `photography` - Photography and Videography Services\n* `printing` - Printing and Copy Services\n* `professional` - Professional Services\n* `travel` - Travel Agencies\n* `utilities` - Utilities and Renewable Energy Services\n* `wholesale` - Wholesale and Distribution\n* `writing` - Writing and Editing Services\n* `virtual_assistance` - Virtual Assistance and Admin Support\n* `other` - Other","nullable":true},"website":{"type":"string","format":"uri","nullable":true,"maxLength":300},"company_size":{"type":"string","nullable":true,"maxLength":100},"annual_revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Annual revenue in USD"},"minimum_order_amount":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Minimum order amount required"},"default_currency":{"type":"string","minLength":1,"description":"Default currency code (ISO 4217) for this entity's transactions","maxLength":3},"first_contact_date":{"type":"string","format":"date","nullable":true},"last_contact_date":{"type":"string","format":"date","nullable":true},"next_follow_up_date":{"type":"string","format":"date","nullable":true},"last_order_date":{"type":"string","format":"date","nullable":true},"contract_start_date":{"type":"string","format":"date","nullable":true},"contract_end_date":{"type":"string","format":"date","nullable":true},"quality_rating":{"type":"string","format":"decimal","pattern":"^-?\\d{0,1}(?:\\.\\d{0,2})?$","nullable":true,"description":"Quality rating out of 5.00"},"delivery_rating":{"type":"string","format":"decimal","pattern":"^-?\\d{0,1}(?:\\.\\d{0,2})?$","nullable":true,"description":"Delivery performance rating out of 5.00"},"address":{"allOf":[{"$ref":"#/components/schemas/ClientAddressRequest"}],"nullable":true},"banking_information":{"allOf":[{"$ref":"#/components/schemas/ClientBankingInformationRequest"}],"nullable":true}},"required":["name"]},"ClientAddressRequest":{"type":"object","description":"Serializer for Address model.\nCountry field is explicitly defined as CharField to handle django-countries CountryField.","properties":{"address_line_1":{"type":"string","nullable":true,"maxLength":300},"address_line_2":{"type":"string","nullable":true,"maxLength":300},"city":{"type":"string","nullable":true,"maxLength":300},"province_state":{"type":"string","nullable":true,"title":"Province/State","maxLength":300},"postal_code":{"type":"string","nullable":true,"maxLength":300},"country":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true,"title":"Phone Number","pattern":"^\\+?1?\\d{9,15}$","maxLength":17}}},"ClientBankingInformationRequest":{"type":"object","description":"Serializer for BankingInformation model with all banking fields.","properties":{"bank_name":{"type":"string","nullable":true,"maxLength":200},"account_number":{"type":"string","nullable":true,"maxLength":100},"branch_code":{"type":"string","nullable":true,"maxLength":50},"account_type":{"enum":["checking","savings","business","other","",null],"type":"string","description":"* `checking` - Checking\n* `savings` - Savings\n* `business` - Business\n* `other` - Other","nullable":true},"routing_number":{"type":"string","nullable":true,"maxLength":50},"swift_code":{"type":"string","nullable":true,"maxLength":50}}}}}}
```
