# 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}}}}}}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.skhokho.ai/models.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
