From 8d929ec09d96bf26dc63ce791b35e7d4b2c15d5b Mon Sep 17 00:00:00 2001 From: Darko Gjorgjijoski <5760249+gdarko@users.noreply.github.com> Date: Sat, 13 Jun 2026 15:51:54 +0200 Subject: [PATCH] feat(api): generate OpenAPI spec with Scramble for api-docs.invoiceshelf.com (#685) Auto-generate an OpenAPI 3.1 spec from the v1 API's FormRequests and Resources (no annotations) for publishing at api-docs.invoiceshelf.com as a static Swagger UI site. - config/scramble.php: scope to api/v1, version from version.md, clean placeholder server, export to public/openapi.json - ScrambleServiceProvider: advertise Bearer (Sanctum) auth; add the required `company` tenancy header only to routes using the `company` middleware - OpenApiDocumentationTest: assert spec shape, auth scheme, company-header gating - .github/workflows/openapi.yml: export + commit spec on release, notify the api-docs site to rebuild - public/openapi.json: generated seed spec (184 paths) - dedoc/scramble added as a dev-only dependency Co-authored-by: Claude Opus 4.8 (1M context) --- .github/workflows/openapi.yml | 84 + app/Providers/ScrambleServiceProvider.php | 64 + bootstrap/providers.php | 2 + composer.json | 1 + composer.lock | 82 +- config/scramble.php | 187 + public/openapi.json | 31244 +++++++++++++++++++ tests/Feature/OpenApiDocumentationTest.php | 87 + 8 files changed, 31750 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/openapi.yml create mode 100644 app/Providers/ScrambleServiceProvider.php create mode 100644 config/scramble.php create mode 100644 public/openapi.json create mode 100644 tests/Feature/OpenApiDocumentationTest.php diff --git a/.github/workflows/openapi.yml b/.github/workflows/openapi.yml new file mode 100644 index 00000000..de636d18 --- /dev/null +++ b/.github/workflows/openapi.yml @@ -0,0 +1,84 @@ +name: Export OpenAPI Spec + +# Regenerates public/openapi.json with Scramble and notifies the api-docs site +# (api-docs.invoiceshelf.com) to rebuild. Runs on every published release — so the +# committed spec matches released code — and can be triggered manually. +# +# v3 only: this lives on the 3.x branch. The api-docs site documents the v3 API. +on: + release: + types: [published] + workflow_dispatch: + +permissions: + contents: write + +jobs: + export: + name: Export & publish OpenAPI document + runs-on: ubuntu-latest + env: + extensions: bcmath, curl, dom, gd, json, libxml, mbstring, pcntl, pdo, pdo_sqlite, zip + steps: + - name: Checkout (release branch) + uses: actions/checkout@v6 + with: + # On a release, target_commitish is the branch the tag was cut from, so + # the spec is committed back to a branch rather than a detached tag. + ref: ${{ github.event.release.target_commitish || github.ref_name }} + + - name: Set up PHP + uses: shivammathur/setup-php@v2 + with: + php-version: 8.4 + extensions: ${{ env.extensions }} + coverage: none + tools: composer + + - name: Install Composer dependencies (incl. dev — Scramble is dev-only) + uses: ramsey/composer-install@4.0.0 + + - name: Prepare app environment + run: | + cp -n .env.example .env || true + php artisan key:generate + + - name: Migrate a throwaway SQLite database + # Scramble introspects the schema to build response shapes, so the tables + # must exist. Data is irrelevant — schema only. + run: | + mkdir -p database + : > database/openapi.sqlite + php artisan migrate --force --no-interaction + env: + DB_CONNECTION: sqlite + DB_DATABASE: ${{ github.workspace }}/database/openapi.sqlite + + - name: Export OpenAPI document + run: php artisan scramble:export --path=public/openapi.json + env: + DB_CONNECTION: sqlite + DB_DATABASE: ${{ github.workspace }}/database/openapi.sqlite + + - name: Commit updated spec + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "docs: regenerate OpenAPI spec [skip ci]" + file_pattern: public/openapi.json + commit_user_name: "GitHub Actions" + commit_user_email: "actions@github.com" + + - name: Notify api-docs site to rebuild + continue-on-error: true + env: + PAT: ${{ secrets.API_DOCS_DISPATCH_PAT }} + run: | + if [ -z "$PAT" ]; then + echo "No API_DOCS_DISPATCH_PAT secret set; skipping rebuild notification." + exit 0 + fi + curl -sf -X POST \ + -H "Authorization: token $PAT" \ + -H "Accept: application/vnd.github+json" \ + https://api.github.com/repos/InvoiceShelf/api-docs/dispatches \ + -d '{"event_type":"spec-updated"}' diff --git a/app/Providers/ScrambleServiceProvider.php b/app/Providers/ScrambleServiceProvider.php new file mode 100644 index 00000000..4de73b4e --- /dev/null +++ b/app/Providers/ScrambleServiceProvider.php @@ -0,0 +1,64 @@ +withDocumentTransformers($this->documentTransformer(...)) + ->withOperationTransformers($this->operationTransformer(...)); + } + + /** + * Advertise Bearer (Sanctum personal access token) auth as the global + * security scheme. The customer-portal guard (auth:customer) is session-based + * and not part of the token API surface, so it is intentionally not exposed. + */ + protected function documentTransformer(OpenApi $openApi): void + { + $openApi->secure(SecurityScheme::http('bearer')); + } + + /** + * Add the multi-tenancy `company` header to every company-scoped operation. + * CompanyMiddleware (alias `company`) resolves the active tenant from this + * header, so only routes that actually run it get the parameter — auth, ping, + * and installation endpoints stay clean. + */ + protected function operationTransformer(Operation $operation, RouteInfo $routeInfo): void + { + if (! in_array('company', $routeInfo->route->gatherMiddleware(), true)) { + return; + } + + $operation->addParameters([ + Parameter::make('company', 'header') + ->description('ID of the company the request operates on (multi-tenancy).') + ->setSchema(Schema::fromType(new StringType)) + ->required(true), + ]); + } +} diff --git a/bootstrap/providers.php b/bootstrap/providers.php index a562b0c4..ce468456 100644 --- a/bootstrap/providers.php +++ b/bootstrap/providers.php @@ -7,6 +7,7 @@ use App\Providers\DriverRegistryProvider; use App\Providers\DropboxServiceProvider; use App\Providers\PdfServiceProvider; use App\Providers\RouteServiceProvider; +use App\Providers\ScrambleServiceProvider; use App\Providers\ViewServiceProvider; use App\Support\Hashids\HashidsServiceProvider; @@ -20,4 +21,5 @@ return [ DriverRegistryProvider::class, AiServiceProvider::class, AppConfigProvider::class, + ScrambleServiceProvider::class, ]; diff --git a/composer.json b/composer.json index 4784f9a6..2a391870 100644 --- a/composer.json +++ b/composer.json @@ -35,6 +35,7 @@ }, "require-dev": { "barryvdh/laravel-ide-helper": "^3.5", + "dedoc/scramble": "^0.13.27", "fakerphp/faker": "^1.23", "jasonmccreary/laravel-test-assertions": "^2.9", "laravel/pint": "^1.13", diff --git a/composer.lock b/composer.lock index ffc13f52..57fc1fc6 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "56df267c2bb3603a8093fb53d6cf137c", + "content-hash": "0330848b7c96620b5ee47fcb585f719c", "packages": [ { "name": "aws/aws-crt-php", @@ -9531,6 +9531,86 @@ ], "time": "2024-11-12T16:29:46+00:00" }, + { + "name": "dedoc/scramble", + "version": "v0.13.27", + "source": { + "type": "git", + "url": "https://github.com/dedoc/scramble.git", + "reference": "5b067b1168b4092ee10b320469a09823610f48b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dedoc/scramble/zipball/5b067b1168b4092ee10b320469a09823610f48b1", + "reference": "5b067b1168b4092ee10b320469a09823610f48b1", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^10.0|^11.0|^12.0|^13.0", + "myclabs/deep-copy": "^1.12", + "nikic/php-parser": "^5.0", + "php": "^8.1", + "phpstan/phpdoc-parser": "^1.0|^2.0", + "spatie/laravel-package-tools": "^1.9.2" + }, + "require-dev": { + "larastan/larastan": "^3.3", + "laravel/pint": "^v1.1.0", + "nunomaduro/collision": "^7.0|^8.0", + "orchestra/testbench": "^8.0|^9.0|^10.0|^11.0", + "pestphp/pest": "^2.34|^3.7|^4.4", + "pestphp/pest-plugin-laravel": "^2.3|^3.1|^4.1", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5|^11.5.3|^12.5.12", + "spatie/laravel-permission": "^6.10|^7.2", + "spatie/pest-plugin-snapshots": "^2.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Dedoc\\Scramble\\ScrambleServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Dedoc\\Scramble\\": "src", + "Dedoc\\Scramble\\Database\\Factories\\": "database/factories" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Lytvynenko", + "email": "litvinenko95@gmail.com", + "role": "Developer" + } + ], + "description": "Automatic generation of API documentation for Laravel applications.", + "homepage": "https://github.com/dedoc/scramble", + "keywords": [ + "documentation", + "laravel", + "openapi" + ], + "support": { + "issues": "https://github.com/dedoc/scramble/issues", + "source": "https://github.com/dedoc/scramble/tree/v0.13.27" + }, + "funding": [ + { + "url": "https://github.com/romalytvynenko", + "type": "github" + } + ], + "time": "2026-06-12T12:41:44+00:00" + }, { "name": "doctrine/deprecations", "version": "1.1.6", diff --git a/config/scramble.php b/config/scramble.php new file mode 100644 index 00000000..11dc77de --- /dev/null +++ b/config/scramble.php @@ -0,0 +1,187 @@ + [ + * 'include' => 'api', + * 'exclude' => ['api/internal'], + * ], + * + * Without *, patterns match path segments (api matches api and api/users, not apiary). + * With *, Str::is is used (e.g. api/v*). + * + * One static include → default server is /{include} and paths are stripped (/users). + * Multiple includes or wildcards → server defaults to / and paths stay full (/api/users). + * Override with `servers`, or use Scramble::registerApi() for separate bases. + */ + 'api_path' => 'api/v1', + + /* + * Your API domain. By default, app domain is used. This is also a part of the default API routes + * matcher, so when implementing your own, make sure you use this config if needed. + */ + 'api_domain' => null, + + /* + * The path where your OpenAPI specification will be exported (relative to the + * project root). Committed to the repo by CI so the api-docs.invoiceshelf.com + * build can fetch it; also servable directly from this instance at /openapi.json. + */ + 'export_path' => 'public/openapi.json', + + /* + * Cache configuration for the generated OpenAPI document. + * + * Use `scramble:cache` to warm the cache and `scramble:clear` to invalidate it. + */ + 'cache' => [ + 'key' => 'scramble.openapi', + 'store' => 'file', + ], + + 'info' => [ + /* + * API version. Defaults to the value in the repo's version.md so the + * generated spec self-labels (e.g. 3.0.0-alpha.1 on v3.0, 2.x on master). + */ + 'version' => env('API_VERSION', is_file(base_path('version.md')) + ? trim((string) file_get_contents(base_path('version.md'))) + : '0.0.1'), + + /* + * Description rendered on the home page of the API documentation (`/docs/api`). + */ + 'description' => 'REST API for InvoiceShelf — open-source invoicing & expense tracking. ' + .'Authenticate with a Sanctum personal access token (Authorization: Bearer ). ' + .'Company-scoped endpoints additionally require a `company` header carrying the company ID.', + ], + + 'ui' => [ + 'title' => 'InvoiceShelf API', + ], + + 'renderer' => 'elements', + + 'renderers' => [ + /* + * Stoplight Elements config options: https://docs.stoplight.io/docs/elements/b074dc47b2826-elements-configuration-options + */ + 'elements' => [ + 'view' => 'scramble::docs', + 'theme' => 'light', + 'hideTryIt' => false, + 'hideSchemas' => false, + 'logo' => '', + 'tryItCredentialsPolicy' => 'include', + 'layout' => 'responsive', + 'router' => 'hash', + ], + /* + * Scalar API reference config options: https://scalar.com/products/api-references/configuration + */ + 'scalar' => [ + 'view' => 'scramble::scalar', + 'cdn' => 'https://cdn.jsdelivr.net/npm/@scalar/api-reference', + 'theme' => 'laravel', + 'proxyUrl' => 'https://proxy.scalar.com', + 'darkMode' => false, + 'showDeveloperTools' => 'never', + 'agent' => ['disabled' => true], + 'credentials' => 'include', + ], + ], + + /* + * The list of servers of the API. By default, when `null`, server URL will be created from + * `scramble.api_path` and `scramble.api_domain` config variables. When providing an array, you + * will need to specify the local server URL manually (if needed). + * + * Example of non-default config (final URLs are generated using Laravel `url` helper): + * + * ```php + * 'servers' => [ + * 'Live' => 'api', + * 'Prod' => 'https://scramble.dedoc.co/api', + * ], + * ``` + */ + 'servers' => [ + // InvoiceShelf is self-hosted: every instance has its own host. A clean + // placeholder is documented here instead of baking in the build-time + // APP_URL (which would leak a dev/CI hostname into the public spec). + // Readers replace it with their own instance URL. + 'Your InvoiceShelf instance' => 'https://your-instance.example.com/api/v1', + ], + + /** + * Determines how Scramble stores the descriptions of enum cases. + * Available options: + * - 'description' – Case descriptions are stored as the enum schema's description using table formatting. + * - 'extension' – Case descriptions are stored in the `x-enumDescriptions` enum schema extension. + * + * @see https://redocly.com/docs-legacy/api-reference-docs/specification-extensions/x-enum-descriptions + * - false - Case descriptions are ignored. + */ + 'enum_cases_description_strategy' => 'description', + + /** + * Determines how Scramble stores the names of enum cases. + * Available options: + * - 'names' – Case names are stored in the `x-enumNames` enum schema extension. + * - 'varnames' - Case names are stored in the `x-enum-varnames` enum schema extension. + * - false - Case names are not stored. + */ + 'enum_cases_names_strategy' => false, + + /** + * When Scramble encounters deep objects in query parameters, it flattens the parameters so the generated + * OpenAPI document correctly describes the API. Flattening deep query parameters is relevant until + * OpenAPI 3.2 is released and query string structure can be described properly. + * + * For example, this nested validation rule describes the object with `bar` property: + * `['foo.bar' => ['required', 'int']]`. + * + * When `flatten_deep_query_parameters` is `true`, Scramble will document the parameter like so: + * `{"name":"foo[bar]", "schema":{"type":"int"}, "required":true}`. + * + * When `flatten_deep_query_parameters` is `false`, Scramble will document the parameter like so: + * `{"name":"foo", "schema": {"type":"object", "properties":{"bar":{"type": "int"}}, "required": ["bar"]}, "required":true}`. + */ + 'flatten_deep_query_parameters' => true, + + 'middleware' => [ + 'web', + RestrictedDocsAccess::class, + ], + + 'extensions' => [], + + /* + * Automatically document API security (OpenAPI `security` / `securitySchemes`) based on route + * middleware. + * + * Disabled by default. Uncomment the line below to enable `MiddlewareAuthSecurityStrategy`. + * When at least one documented route uses middleware matching the configured patterns (by default + * `auth` and `auth:*`), bearer auth is applied globally. Routes without matching middleware are + * marked as public (`security: []`). + * + * Set to `null` explicitly to disable. If you already configure security manually via + * `afterOpenApiGenerated` / `extendOpenApi`, keep this disabled to avoid duplicate schemes. + * + * Customize with a class-string or [class, options]: + * + * 'security_strategy' => [ + * \Dedoc\Scramble\SecurityDocumentation\MiddlewareAuthSecurityStrategy::class, + * [ + * 'middleware' => ['auth', 'auth:*'], + * 'scheme' => \Dedoc\Scramble\Support\Generator\SecurityScheme::http('bearer'), + * ], + * ], + */ + // 'security_strategy' => \Dedoc\Scramble\SecurityDocumentation\MiddlewareAuthSecurityStrategy::class, + 'security_strategy' => null, +]; diff --git a/public/openapi.json b/public/openapi.json new file mode 100644 index 00000000..0c53c2bd --- /dev/null +++ b/public/openapi.json @@ -0,0 +1,31244 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "InvoiceShelf API", + "version": "3.0.0-alpha.1", + "description": "REST API for InvoiceShelf \u2014 open-source invoicing & expense tracking. Authenticate with a Sanctum personal access token (Authorization: Bearer ). Company-scoped endpoints additionally require a `company` header carrying the company ID." + }, + "servers": [ + { + "url": "https://your-instance.example.com/api/v1", + "description": "Your InvoiceShelf instance" + } + ], + "security": [ + { + "http": [] + } + ], + "paths": { + "/abilities": { + "get": { + "operationId": "role.abilities", + "summary": "Handle the incoming request", + "tags": [ + "Abilities" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "abilities": { + "type": "string" + } + }, + "required": [ + "abilities" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/{company}/customer/estimate/{id}/status": { + "post": { + "operationId": "estimate.acceptEstimate", + "summary": "Handle the incoming request", + "tags": [ + "AcceptEstimate" + ], + "parameters": [ + { + "name": "company", + "in": "path", + "required": true, + "description": "The company slug", + "schema": { + "type": [ + "string", + "null" + ] + } + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/super-admin/dashboard": { + "get": { + "operationId": "adminDashboard.index", + "tags": [ + "AdminDashboard" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "app_version": { + "anyOf": [ + { + "type": "null" + }, + { + "type": "array", + "items": {} + }, + { + "type": "string" + }, + { + "type": "object" + } + ] + }, + "php_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object" + } + ] + }, + "database": { + "type": "object", + "properties": { + "driver": { + "type": "string" + }, + "version": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "driver", + "version" + ] + }, + "counts": { + "type": "object", + "properties": { + "companies": { + "type": "integer", + "minimum": 0 + }, + "users": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "companies", + "users" + ] + } + }, + "required": [ + "app_version", + "php_version", + "database", + "counts" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/installation/ai/config": { + "get": { + "operationId": "aiConfiguration.show", + "summary": "Return the current AI config defaults plus the driver list for the wizard form", + "tags": [ + "AiConfiguration" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "config": { + "type": "array", + "items": {} + }, + "drivers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "label": {}, + "website": {}, + "default_base_url": {}, + "supported_roles": {}, + "suggested_models": {}, + "config_fields": {} + }, + "required": [ + "value", + "label", + "website", + "default_base_url", + "supported_roles", + "suggested_models", + "config_fields" + ] + } + } + }, + "required": [ + "config", + "drivers" + ] + } + } + } + } + } + }, + "post": { + "operationId": "aiConfiguration.save", + "summary": "Persist the installer's AI config choice and advance the wizard step", + "tags": [ + "AiConfiguration" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "ai_enabled": { + "type": "string", + "enum": [ + "YES", + "NO" + ] + }, + "ai_driver": { + "type": [ + "string", + "null" + ] + }, + "ai_api_key": { + "type": [ + "string", + "null" + ] + }, + "ai_base_url": { + "type": [ + "string", + "null" + ], + "format": "uri" + }, + "ai_chat_enabled": { + "type": [ + "string", + "null" + ], + "enum": [ + "YES", + "NO" + ] + }, + "ai_chat_model": { + "type": [ + "string", + "null" + ], + "maxLength": 200 + }, + "ai_text_generation_enabled": { + "type": [ + "string", + "null" + ], + "enum": [ + "YES", + "NO" + ] + }, + "ai_text_generation_model": { + "type": [ + "string", + "null" + ], + "maxLength": 200 + } + }, + "required": [ + "ai_enabled" + ] + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/ai/drivers": { + "get": { + "operationId": "aiConfiguration.getDrivers", + "summary": "Return the AI driver list for the admin UI \u2014 same shape as the exchange rate endpoint", + "tags": [ + "AiConfiguration" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "ai_drivers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "label": {}, + "website": {}, + "default_base_url": {}, + "supported_roles": {}, + "suggested_models": {}, + "config_fields": {} + }, + "required": [ + "value", + "label", + "website", + "default_base_url", + "supported_roles", + "suggested_models", + "config_fields" + ] + } + } + }, + "required": [ + "ai_drivers" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/ai/config": { + "get": { + "operationId": "aiConfiguration.getConfig", + "summary": "Get the global AI configuration with decrypted API key masked for response", + "tags": [ + "AiConfiguration" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": {} + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "aiConfiguration.saveConfig", + "description": "If the submitted api_key is the masked placeholder, we retain the stored value \u2014\notherwise the user would have to re-enter the key every time they save the form.", + "summary": "Persist the global AI configuration", + "tags": [ + "AiConfiguration" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "use_custom_ai_config": { + "type": "string" + }, + "ai_enabled": { + "type": [ + "string", + "null" + ], + "enum": [ + "YES", + "NO" + ] + }, + "ai_driver": { + "type": [ + "string", + "null" + ], + "enum": [ + "openrouter" + ] + }, + "ai_api_key": { + "type": [ + "string", + "null" + ] + }, + "ai_base_url": { + "type": [ + "string", + "null" + ], + "format": "uri" + }, + "ai_chat_enabled": { + "type": [ + "string", + "null" + ], + "enum": [ + "YES", + "NO" + ] + }, + "ai_chat_model": { + "type": [ + "string", + "null" + ], + "maxLength": 200 + }, + "ai_text_generation_enabled": { + "type": [ + "string", + "null" + ], + "enum": [ + "YES", + "NO" + ] + }, + "ai_text_generation_model": { + "type": [ + "string", + "null" + ], + "maxLength": 200 + } + } + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "string", + "const": "ai_variables_save_successfully" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/ai/test": { + "post": { + "operationId": "aiConfiguration.testConnection", + "summary": "Test the currently configured AI provider by instantiating its driver and calling validateConnection()", + "tags": [ + "AiConfiguration" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "ai_driver": { + "type": "string" + }, + "ai_api_key": { + "type": [ + "string", + "null" + ] + }, + "ai_base_url": { + "type": [ + "string", + "null" + ], + "format": "uri" + } + }, + "required": [ + "ai_driver" + ] + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "details": { + "type": "object", + "additionalProperties": {} + } + }, + "required": [ + "success", + "details" + ] + } + } + } + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/installation/set-domain": { + "put": { + "operationId": "setup.appDomain", + "tags": [ + "AppDomain" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DomainEnvironmentRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + }, + { + "anyOf": [ + { + "type": "object", + "properties": { + "success": { + "type": "string", + "const": "domain_variable_save_successfully" + } + }, + "required": [ + "success" + ] + }, + { + "type": "object", + "properties": { + "error": { + "type": "string", + "const": "domain_verification_failed" + } + }, + "required": [ + "error" + ] + } + ] + } + ] + } + } + } + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/app/version": { + "get": { + "operationId": "appVersion", + "summary": "Handle the incoming request", + "tags": [ + "AppVersion" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "version": { + "anyOf": [ + { + "type": "null" + }, + { + "type": "array", + "items": {} + }, + { + "type": "string" + }, + { + "type": "object" + } + ] + }, + "channel": { + "type": "string", + "const": "stable" + } + }, + "required": [ + "version", + "channel" + ] + } + } + } + } + } + } + }, + "/auth/login": { + "post": { + "operationId": "auth.login", + "tags": [ + "Auth" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LoginRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "Bearer" + }, + "token": { + "type": "string" + } + }, + "required": [ + "type", + "token" + ] + } + } + } + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/auth/logout": { + "post": { + "operationId": "auth.logout", + "tags": [ + "Auth" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/auth/check": { + "get": { + "operationId": "auth.check", + "tags": [ + "Auth" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "boolean" + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/backups": { + "get": { + "operationId": "backups.index", + "tags": [ + "Backups" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "backups": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + }, + "error": { + "type": "string", + "const": "invalid_disk_credentials" + }, + "error_message": { + "type": "string" + } + }, + "required": [ + "backups", + "error", + "error_message" + ] + }, + { + "type": "object", + "properties": { + "backups": { + "type": "array", + "items": {} + } + }, + "required": [ + "backups" + ] + } + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "backups.store", + "tags": [ + "Backups" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/backups/{disk}": { + "delete": { + "operationId": "backups.destroy", + "tags": [ + "Backups" + ], + "parameters": [ + { + "name": "disk", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "path", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/download-backup": { + "get": { + "operationId": "backups.download", + "tags": [ + "Backups" + ], + "parameters": [ + { + "name": "path", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/zip": { + "schema": { + "type": "string" + } + } + }, + "headers": { + "Transfer-Encoding": { + "required": true, + "schema": { + "type": "string", + "enum": [ + "chunked" + ] + } + } + } + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/bootstrap": { + "get": { + "operationId": "company.general.bootstrap", + "summary": "Handle the incoming request", + "tags": [ + "Bootstrap" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "current_user": { + "$ref": "#/components/schemas/UserResource" + }, + "current_user_settings": { + "type": "array", + "items": { + "type": "string" + } + }, + "current_user_abilities": { + "type": "object" + }, + "companies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "current_company": { + "$ref": "#/components/schemas/CompanyResource" + }, + "current_company_settings": { + "type": "array", + "items": { + "type": "string" + } + }, + "current_company_currency": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/components/schemas/Currency" + }, + { + "type": "null" + } + ] + }, + "config": { + "type": "string" + }, + "global_settings": { + "type": "array", + "items": { + "type": "string" + } + }, + "ai": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "chat_enabled": { + "type": "boolean" + }, + "text_generation_enabled": { + "type": "boolean" + } + }, + "required": [ + "enabled", + "chat_enabled", + "text_generation_enabled" + ] + }, + "main_menu": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "link": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "name": { + "type": "string" + }, + "group": { + "type": "string" + }, + "group_label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "" + ] + } + ] + }, + "priority": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer", + "enum": [ + 100 + ] + } + ] + } + }, + "required": [ + "title", + "link", + "icon", + "name", + "group", + "group_label", + "priority" + ] + }, + { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "link": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "name": { + "type": "string" + }, + "group": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "modules" + ] + } + ] + }, + "group_label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "navigation.modules" + ] + } + ] + }, + "priority": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer", + "enum": [ + 100 + ] + } + ] + } + }, + "required": [ + "title", + "link", + "icon", + "name", + "group", + "group_label", + "priority" + ] + } + ] + } + }, + "setting_menu": { + "type": "array", + "items": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "link": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "name": { + "type": "string" + }, + "group": { + "type": "string" + }, + "group_label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "" + ] + } + ] + }, + "priority": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer", + "enum": [ + 100 + ] + } + ] + } + }, + "required": [ + "title", + "link", + "icon", + "name", + "group", + "group_label", + "priority" + ] + } + }, + "modules": { + "type": "array", + "items": {} + }, + "user_menu": { + "type": "array", + "items": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "link": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "priority": { + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "required": [ + "title", + "link", + "icon", + "name" + ] + } + }, + "pending_invitations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyInvitationResource" + } + } + }, + "required": [ + "current_user", + "current_user_settings", + "current_user_abilities", + "companies", + "current_company", + "current_company_settings", + "current_company_currency", + "config", + "global_settings", + "ai", + "main_menu", + "setting_menu", + "modules", + "user_menu", + "pending_invitations" + ] + }, + { + "type": "object", + "properties": { + "current_user": { + "$ref": "#/components/schemas/UserResource" + }, + "current_user_settings": { + "type": "array", + "items": { + "type": "string" + } + }, + "current_user_abilities": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + }, + "companies": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + }, + "current_company": { + "type": "null" + }, + "current_company_settings": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + }, + "current_company_currency": { + "anyOf": [ + { + "$ref": "#/components/schemas/Currency" + }, + { + "type": "null" + } + ] + }, + "config": { + "type": "string" + }, + "global_settings": { + "type": "array", + "items": { + "type": "string" + } + }, + "main_menu": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + }, + "setting_menu": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + }, + "modules": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + }, + "pending_invitations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyInvitationResource" + } + } + }, + "required": [ + "current_user", + "current_user_settings", + "current_user_abilities", + "companies", + "current_company", + "current_company_settings", + "current_company_currency", + "config", + "global_settings", + "main_menu", + "setting_menu", + "modules", + "pending_invitations" + ] + }, + { + "type": "object", + "properties": { + "current_user": { + "$ref": "#/components/schemas/UserResource" + }, + "current_user_settings": { + "type": "array", + "items": { + "type": "string" + } + }, + "current_user_abilities": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + }, + "companies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "current_company": { + "type": "null" + }, + "current_company_settings": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + }, + "current_company_currency": { + "anyOf": [ + { + "$ref": "#/components/schemas/Currency" + }, + { + "type": "null" + } + ] + }, + "config": { + "type": "string" + }, + "global_settings": { + "type": "array", + "items": { + "type": "string" + } + }, + "main_menu": { + "type": "array", + "items": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "link": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "name": { + "type": "string" + }, + "group": { + "type": "string" + }, + "group_label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "" + ] + } + ] + }, + "priority": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer", + "enum": [ + 100 + ] + } + ] + } + }, + "required": [ + "title", + "link", + "icon", + "name", + "group", + "group_label", + "priority" + ] + } + }, + "setting_menu": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + }, + "modules": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + }, + "admin_mode": { + "type": "boolean" + }, + "pending_invitations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyInvitationResource" + } + } + }, + "required": [ + "current_user", + "current_user_settings", + "current_user_abilities", + "companies", + "current_company", + "current_company_settings", + "current_company_currency", + "config", + "global_settings", + "main_menu", + "setting_menu", + "modules", + "admin_mode", + "pending_invitations" + ] + } + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/current-company": { + "get": { + "operationId": "bootstrap.currentCompany", + "tags": [ + "Bootstrap" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`CompanyResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/{company}/customer/bootstrap": { + "get": { + "operationId": "customerPortal.general.bootstrap", + "summary": "Handle the incoming request", + "tags": [ + "Bootstrap" + ], + "parameters": [ + { + "name": "company", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`App.Http.Resources.Customer.CustomerResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CustomerResource" + }, + "meta": { + "type": "object", + "properties": { + "menu": { + "type": "string" + }, + "current_customer_currency": { + "type": "string" + }, + "current_company_currency": { + "type": [ + "string", + "null" + ] + }, + "modules": { + "type": "array", + "items": {} + }, + "current_company_language": { + "type": "null" + } + }, + "required": [ + "menu", + "current_customer_currency", + "current_company_currency", + "modules", + "current_company_language" + ] + } + }, + "required": [ + "data", + "meta" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/ai/chat": { + "post": { + "operationId": "ai.chat", + "description": "If `conversation_id` is omitted (or belongs to a conversation the user\ndoesn't own), we start a fresh conversation scoped to the current\n(company_id, user_id). This matches the \"new chat\" UX where the user\nopens the drawer and starts typing immediately.", + "summary": "Send a message into a conversation and get the assistant's reply", + "tags": [ + "Chat" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "conversation_id": { + "type": [ + "integer", + "null" + ] + }, + "message": { + "type": "string", + "maxLength": 10000 + } + }, + "required": [ + "message" + ] + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "conversation": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "model": { + "type": [ + "string", + "null" + ] + }, + "updated_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + } + }, + "required": [ + "id", + "title", + "model", + "updated_at" + ] + }, + "message": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "role": { + "type": "string" + }, + "content": { + "type": [ + "string", + "null" + ] + }, + "created_at": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "id", + "role", + "content", + "created_at" + ] + } + }, + "required": [ + "conversation", + "message" + ] + } + } + } + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/super-admin/companies": { + "get": { + "operationId": "companies.index", + "tags": [ + "Companies" + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "schema": { + "type": "string", + "default": 10 + } + } + ], + "responses": { + "200": { + "description": "Paginated set of `CompanyResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "links": { + "type": "object", + "properties": { + "first": { + "type": [ + "string", + "null" + ] + }, + "last": { + "type": [ + "string", + "null" + ] + }, + "prev": { + "type": [ + "string", + "null" + ] + }, + "next": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "first", + "last", + "prev", + "next" + ] + }, + "meta": { + "type": "object", + "properties": { + "current_page": { + "type": "integer", + "minimum": 1 + }, + "from": { + "type": [ + "integer", + "null" + ], + "minimum": 1 + }, + "last_page": { + "type": "integer", + "minimum": 1 + }, + "links": { + "type": "array", + "description": "Generated paginator links.", + "items": { + "type": "object", + "properties": { + "url": { + "type": [ + "string", + "null" + ] + }, + "label": { + "type": "string" + }, + "active": { + "type": "boolean" + } + }, + "required": [ + "url", + "label", + "active" + ] + } + }, + "path": { + "type": [ + "string", + "null" + ], + "description": "Base path for paginator generated URLs." + }, + "per_page": { + "type": "integer", + "description": "Number of items shown per page.", + "minimum": 0 + }, + "to": { + "type": [ + "integer", + "null" + ], + "description": "Number of the last item in the slice.", + "minimum": 1 + }, + "total": { + "type": "integer", + "description": "Total number of items being paginated.", + "minimum": 0 + } + }, + "required": [ + "current_page", + "from", + "last_page", + "links", + "path", + "per_page", + "to", + "total" + ] + } + }, + "required": [ + "data", + "links", + "meta" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/super-admin/companies/{company}": { + "get": { + "operationId": "companies.show", + "tags": [ + "Companies" + ], + "parameters": [ + { + "name": "company", + "in": "path", + "required": true, + "description": "The company ID", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "`CompanyResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "companies.update", + "tags": [ + "Companies" + ], + "parameters": [ + { + "name": "company", + "in": "path", + "required": true, + "description": "The company ID", + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdminCompanyUpdateRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`CompanyResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + } + } + } + }, + "/companies": { + "post": { + "operationId": "companies.store", + "tags": [ + "Companies" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CompaniesRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`CompanyResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + }, + "get": { + "operationId": "companies.userCompanies", + "tags": [ + "Companies" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `CompanyResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyResource" + } + } + }, + "required": [ + "data" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/companies/delete": { + "post": { + "operationId": "companies.destroy", + "tags": [ + "Companies" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + }, + { + "type": "string" + } + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/company": { + "put": { + "operationId": "company.updateCompany", + "tags": [ + "Company" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CompanyRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`CompanyResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/company/upload-logo": { + "post": { + "operationId": "company.uploadCompanyLogo", + "tags": [ + "Company" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CompanyLogoRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/company/ai/config": { + "get": { + "operationId": "companyAiConfiguration.getConfig", + "summary": "Get the per-company AI config with decrypted API key masked for response", + "tags": [ + "CompanyAiConfiguration" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": {} + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "companyAiConfiguration.saveConfig", + "description": "Respects the `use_custom_ai_config` toggle \u2014 when OFF, only the toggle is written\nand the driver fields are discarded (same pattern as the mail company override).", + "summary": "Persist the per-company AI config", + "tags": [ + "CompanyAiConfiguration" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "use_custom_ai_config": { + "type": [ + "string", + "null" + ], + "enum": [ + "YES", + "NO" + ] + }, + "ai_enabled": { + "type": [ + "string", + "null" + ], + "enum": [ + "YES", + "NO" + ] + }, + "ai_driver": { + "type": [ + "string", + "null" + ], + "enum": [ + "openrouter" + ] + }, + "ai_api_key": { + "type": [ + "string", + "null" + ] + }, + "ai_base_url": { + "type": [ + "string", + "null" + ], + "format": "uri" + }, + "ai_chat_enabled": { + "type": [ + "string", + "null" + ], + "enum": [ + "YES", + "NO" + ] + }, + "ai_chat_model": { + "type": [ + "string", + "null" + ], + "maxLength": 200 + }, + "ai_text_generation_enabled": { + "type": [ + "string", + "null" + ], + "enum": [ + "YES", + "NO" + ] + }, + "ai_text_generation_model": { + "type": [ + "string", + "null" + ], + "maxLength": 200 + } + } + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/company/ai/test": { + "post": { + "operationId": "companyAiConfiguration.testConnection", + "summary": "Test a company-level AI configuration without persisting it", + "tags": [ + "CompanyAiConfiguration" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "ai_driver": { + "type": "string" + }, + "ai_api_key": { + "type": [ + "string", + "null" + ] + }, + "ai_base_url": { + "type": [ + "string", + "null" + ], + "format": "uri" + } + }, + "required": [ + "ai_driver" + ] + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "details": { + "type": "object", + "additionalProperties": {} + } + }, + "required": [ + "success", + "details" + ] + } + } + } + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/company/mail/config": { + "get": { + "operationId": "companyMailConfiguration.getDefaultConfig", + "tags": [ + "CompanyMailConfiguration" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "from_name": { + "type": "string" + }, + "from_mail": { + "type": "string" + } + }, + "required": [ + "from_name", + "from_mail" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/company/mail/company-config": { + "get": { + "operationId": "companyMailConfiguration.getMailConfig", + "tags": [ + "CompanyMailConfiguration" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": {} + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "companyMailConfiguration.saveMailConfig", + "tags": [ + "CompanyMailConfiguration" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CompanyMailConfigurationRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/company/mail/company-test": { + "post": { + "operationId": "companyMailConfiguration.testMailConfig", + "tags": [ + "CompanyMailConfiguration" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "to": { + "type": "string", + "format": "email" + }, + "subject": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "to", + "subject", + "message" + ] + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/company-modules": { + "get": { + "operationId": "companyModules.index", + "tags": [ + "CompanyModules" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "slug": { + "type": "string" + }, + "name": { + "type": "string" + }, + "display_name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "has_settings": { + "type": "boolean" + }, + "menu": { + "type": [ + "object", + "null" + ], + "properties": { + "": { + "type": [ + "object", + "null" + ], + "properties": { + "title": { + "type": "string" + }, + "link": { + "type": "string" + }, + "icon": { + "type": "string" + } + }, + "required": [ + "title", + "link", + "icon" + ] + }, + "title": { + "type": "string" + } + }, + "required": [ + null, + "title" + ] + } + }, + "required": [ + "slug", + "name", + "display_name", + "version", + "has_settings", + "menu" + ] + } + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/company/settings": { + "get": { + "operationId": "companySettings.show", + "tags": [ + "CompanySettings" + ], + "parameters": [ + { + "name": "settings[]", + "in": "query", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + }, + "post": { + "operationId": "companySettings.update", + "tags": [ + "CompanySettings" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSettingsRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + }, + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "message": { + "type": "string", + "const": "Cannot update company currency after transactions are created." + } + }, + "required": [ + "success", + "message" + ] + } + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/company/has-transactions": { + "get": { + "operationId": "companySettings.checkTransactions", + "tags": [ + "CompanySettings" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "has_transactions": { + "type": "string" + } + }, + "required": [ + "has_transactions" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/transfer/ownership/{user}": { + "post": { + "operationId": "companySettings.transferOwnership", + "tags": [ + "CompanySettings" + ], + "parameters": [ + { + "name": "user", + "in": "path", + "required": true, + "description": "The user ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + }, + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "message": { + "type": "string", + "const": "User does not belong to this company." + } + }, + "required": [ + "success", + "message" + ] + } + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/config": { + "get": { + "operationId": "general.config", + "summary": "Handle the incoming request", + "tags": [ + "Config" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "array", + "prefixItems": [ + { + "type": "string" + } + ], + "minItems": 1, + "maxItems": 1, + "additionalItems": false + }, + { + "type": "object", + "properties": { + "exchange_rate_drivers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "label": {}, + "website": {}, + "config_fields": {} + }, + "required": [ + "value", + "label", + "website", + "config_fields" + ] + } + } + }, + "required": [ + "exchange_rate_drivers" + ] + } + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/ai/conversations": { + "get": { + "operationId": "conversation.index", + "summary": "List the current user's conversations for the current company", + "tags": [ + "Conversation" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "conversations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AiConversation" + } + } + }, + "required": [ + "conversations" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/ai/conversations/{id}": { + "get": { + "operationId": "conversation.show", + "summary": "Show a single conversation with its full message history", + "tags": [ + "Conversation" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "conversation": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "model": { + "type": [ + "string", + "null" + ] + }, + "created_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "updated_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + } + }, + "required": [ + "id", + "title", + "model", + "created_at", + "updated_at" + ] + }, + "messages": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AiMessage" + } + } + }, + "required": [ + "conversation", + "messages" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "patch": { + "operationId": "conversation.update", + "summary": "Rename a conversation", + "tags": [ + "Conversation" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "title": { + "type": "string", + "maxLength": 255 + } + }, + "required": [ + "title" + ] + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "delete": { + "operationId": "conversation.destroy", + "summary": "Delete a conversation (cascades to messages via DB foreign key)", + "tags": [ + "Conversation" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/countries": { + "get": { + "operationId": "admin.countries_0", + "summary": "Handle the incoming request", + "tags": [ + "Countries" + ], + "responses": { + "200": { + "description": "Array of `CountryResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CountryResource" + } + } + }, + "required": [ + "data" + ] + } + } + } + } + } + } + }, + "/{company}/customer/countries": { + "get": { + "operationId": "admin.countries_0", + "summary": "Handle the incoming request", + "tags": [ + "Countries" + ], + "parameters": [ + { + "name": "company", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `CountryResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CountryResource" + } + } + }, + "required": [ + "data" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/currencies": { + "get": { + "operationId": "admin.currencies", + "tags": [ + "Currencies" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `CurrencyResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CurrencyResource" + } + } + }, + "required": [ + "data" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/custom-fields": { + "get": { + "operationId": "custom-fields.index", + "summary": "Display a listing of the resource", + "tags": [ + "CustomFields" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `CustomFieldResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomFieldResource" + } + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "custom-fields.store", + "summary": "Store a newly created resource in storage", + "tags": [ + "CustomFields" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CustomFieldRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`CustomFieldResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/CustomFieldResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/custom-fields/{customField}": { + "get": { + "operationId": "custom-fields.show", + "summary": "Display the specified resource", + "tags": [ + "CustomFields" + ], + "parameters": [ + { + "name": "customField", + "in": "path", + "required": true, + "description": "The custom field ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`CustomFieldResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/CustomFieldResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "custom-fields.update", + "summary": "Update the specified resource in storage", + "tags": [ + "CustomFields" + ], + "parameters": [ + { + "name": "customField", + "in": "path", + "required": true, + "description": "The custom field ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CustomFieldRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`CustomFieldResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/CustomFieldResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + }, + "delete": { + "operationId": "custom-fields.destroy", + "summary": "Remove the specified resource from storage", + "tags": [ + "CustomFields" + ], + "parameters": [ + { + "name": "customField", + "in": "path", + "required": true, + "description": "The custom field ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/customers/{customer}/stats": { + "get": { + "operationId": "customer.customerStats", + "tags": [ + "CustomerStats" + ], + "parameters": [ + { + "name": "customer", + "in": "path", + "required": true, + "description": "The customer ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`CustomerResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/CustomerResource" + }, + "meta": { + "type": "object", + "properties": { + "chartData": { + "type": "object", + "properties": { + "months": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + }, + "invoiceTotals": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + }, + "expenseTotals": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + }, + "receiptTotals": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + }, + "netProfit": { + "type": "string" + }, + "netProfits": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + }, + "salesTotal": {}, + "totalReceipts": {}, + "totalExpenses": {} + }, + "required": [ + "months", + "invoiceTotals", + "expenseTotals", + "receiptTotals", + "netProfit", + "netProfits", + "salesTotal", + "totalReceipts", + "totalExpenses" + ] + } + }, + "required": [ + "chartData" + ] + } + }, + "required": [ + "data", + "meta" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/customers/delete": { + "post": { + "operationId": "customers.delete", + "summary": "Remove a list of Customers along side all their resources (ie. Estimates, Invoices, Payments and Addresses)", + "tags": [ + "Customers" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteCustomersRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/customers": { + "get": { + "operationId": "customers.index", + "summary": "Display a listing of the resource", + "tags": [ + "Customers" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `CustomerResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomerResource" + } + }, + "meta": { + "type": "object", + "properties": { + "customer_total_count": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "customer_total_count" + ] + } + }, + "required": [ + "data", + "meta" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "customers.store", + "summary": "Store a newly created resource in storage", + "tags": [ + "Customers" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CustomerRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`CustomerResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/CustomerResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/customers/{customer}": { + "get": { + "operationId": "customers.show", + "summary": "Display the specified resource", + "tags": [ + "Customers" + ], + "parameters": [ + { + "name": "customer", + "in": "path", + "required": true, + "description": "The customer ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`CustomerResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/CustomerResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "customers.update", + "summary": "Update the specified resource in storage", + "tags": [ + "Customers" + ], + "parameters": [ + { + "name": "customer", + "in": "path", + "required": true, + "description": "The customer ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CustomerRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`CustomerResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/CustomerResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/dashboard": { + "get": { + "operationId": "dashboard.dashboard", + "summary": "Handle the incoming request", + "tags": [ + "Dashboard" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "total_amount_due": {}, + "total_customer_count": { + "type": "integer", + "minimum": 0 + }, + "total_invoice_count": { + "type": "integer", + "minimum": 0 + }, + "total_estimate_count": { + "type": "integer", + "minimum": 0 + }, + "recent_due_invoices": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/components/schemas/Invoice" + } + }, + { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + } + ] + }, + "recent_estimates": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/components/schemas/Estimate" + } + }, + { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + } + ] + }, + "chart_data": { + "type": "object", + "properties": { + "months": { + "type": "array", + "items": { + "type": "string" + } + }, + "invoice_totals": { + "type": "array", + "items": {} + }, + "expense_totals": { + "type": "array", + "items": {} + }, + "receipt_totals": { + "type": "array", + "items": {} + }, + "net_income_totals": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "months", + "invoice_totals", + "expense_totals", + "receipt_totals", + "net_income_totals" + ] + }, + "total_sales": {}, + "total_receipts": {}, + "total_expenses": {}, + "total_net_income": { + "type": "string" + } + }, + "required": [ + "total_amount_due", + "total_customer_count", + "total_invoice_count", + "total_estimate_count", + "recent_due_invoices", + "recent_estimates", + "chart_data", + "total_sales", + "total_receipts", + "total_expenses", + "total_net_income" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/{company}/customer/dashboard": { + "get": { + "operationId": "general.dashboard", + "summary": "Handle the incoming request", + "tags": [ + "Dashboard" + ], + "parameters": [ + { + "name": "company", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "due_amount": {}, + "recentInvoices": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Invoice" + } + }, + "recentEstimates": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Estimate" + } + }, + "invoice_count": { + "type": "integer", + "minimum": 0 + }, + "estimate_count": { + "type": "integer", + "minimum": 0 + }, + "payment_count": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "due_amount", + "recentInvoices", + "recentEstimates", + "invoice_count", + "estimate_count", + "payment_count" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/installation/database/config": { + "post": { + "operationId": "databaseConfiguration.saveDatabaseEnvironment", + "tags": [ + "DatabaseConfiguration" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseEnvironmentRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + }, + "get": { + "operationId": "databaseConfiguration.getDatabaseEnvironment", + "tags": [ + "DatabaseConfiguration" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "config": { + "type": "object", + "properties": { + "database_connection": { + "type": "string", + "const": "mysql" + }, + "database_host": { + "type": "string", + "const": "127.0.0.1" + }, + "database_port": { + "type": "integer", + "const": 3306 + } + }, + "required": [ + "database_connection", + "database_host", + "database_port" + ] + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "config", + "success" + ] + } + } + } + } + } + } + }, + "/disks": { + "get": { + "operationId": "disks.index", + "tags": [ + "Disk" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `FileDiskResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FileDiskResource" + } + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "disks.store", + "tags": [ + "Disk" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DiskEnvironmentRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/disks/{disk}": { + "get": { + "operationId": "disks.show", + "tags": [ + "Disk" + ], + "parameters": [ + { + "name": "disk", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "token": { + "type": "string" + }, + "key": { + "type": "string" + }, + "secret": { + "type": "string" + }, + "app": { + "type": "string" + }, + "root": { + "type": "string" + } + }, + "required": [ + "token", + "key", + "secret", + "app", + "root" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "disks.update", + "tags": [ + "Disk" + ], + "parameters": [ + { + "name": "disk", + "in": "path", + "required": true, + "description": "The disk ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`FileDiskResource`", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/FileDiskResource" + } + }, + "required": [ + "data" + ] + } + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "delete": { + "operationId": "disks.destroy", + "summary": "Remove the specified resource from storage", + "tags": [ + "Disk" + ], + "parameters": [ + { + "name": "disk", + "in": "path", + "required": true, + "description": "The disk ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/disk/drivers": { + "get": { + "operationId": "disk.getDiskDrivers", + "tags": [ + "Disk" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "drivers": { + "type": "array", + "prefixItems": [ + { + "type": "object", + "properties": { + "name": { + "type": "string", + "const": "Local" + }, + "value": { + "type": "string", + "const": "local" + } + }, + "required": [ + "name", + "value" + ] + }, + { + "type": "object", + "properties": { + "name": { + "type": "string", + "const": "Amazon S3" + }, + "value": { + "type": "string", + "const": "s3" + } + }, + "required": [ + "name", + "value" + ] + }, + { + "type": "object", + "properties": { + "name": { + "type": "string", + "const": "S3 Compatible Storage" + }, + "value": { + "type": "string", + "const": "s3compat" + } + }, + "required": [ + "name", + "value" + ] + }, + { + "type": "object", + "properties": { + "name": { + "type": "string", + "const": "Digital Ocean Spaces" + }, + "value": { + "type": "string", + "const": "doSpaces" + } + }, + "required": [ + "name", + "value" + ] + }, + { + "type": "object", + "properties": { + "name": { + "type": "string", + "const": "Dropbox" + }, + "value": { + "type": "string", + "const": "dropbox" + } + }, + "required": [ + "name", + "value" + ] + } + ], + "minItems": 5, + "maxItems": 5, + "additionalItems": false + }, + "default": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "local" + ] + } + ] + } + }, + "required": [ + "drivers", + "default" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/disk/purposes": { + "get": { + "operationId": "disk.getDiskPurposes", + "tags": [ + "Disk" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "media_disk_id": { + "type": "string" + }, + "pdf_disk_id": { + "type": "string" + }, + "backup_disk_id": { + "type": "string" + } + }, + "required": [ + "media_disk_id", + "pdf_disk_id", + "backup_disk_id" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "disk.updateDiskPurposes", + "tags": [ + "Disk" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "media_disk_id": { + "type": [ + "integer", + "null" + ] + }, + "pdf_disk_id": { + "type": [ + "integer", + "null" + ] + }, + "backup_disk_id": { + "type": [ + "integer", + "null" + ] + } + } + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/estimates/templates": { + "get": { + "operationId": "estimate.estimateTemplates", + "summary": "Handle the incoming request", + "tags": [ + "EstimateTemplates" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "estimateTemplates": { + "type": "array", + "items": {} + } + }, + "required": [ + "estimateTemplates" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/estimates/{estimate}/send/preview": { + "get": { + "operationId": "estimates.sendPreview", + "tags": [ + "Estimates" + ], + "parameters": [ + { + "name": "estimate", + "in": "path", + "required": true, + "description": "The estimate ID", + "schema": { + "type": "integer" + } + }, + { + "name": "subject", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "body", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "from", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "to", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "cc", + "in": "query", + "schema": { + "type": [ + "string", + "null" + ] + } + }, + { + "name": "bcc", + "in": "query", + "schema": { + "type": [ + "string", + "null" + ] + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/estimates/{estimate}/send": { + "post": { + "operationId": "estimates.send", + "tags": [ + "Estimates" + ], + "parameters": [ + { + "name": "estimate", + "in": "path", + "required": true, + "description": "The estimate ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SendEstimatesRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "type": { + "type": "string", + "const": "send" + } + }, + "required": [ + "success", + "type" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/estimates/{estimate}/clone": { + "post": { + "operationId": "estimates.clone", + "tags": [ + "Estimates" + ], + "parameters": [ + { + "name": "estimate", + "in": "path", + "required": true, + "description": "The estimate ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`EstimateResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/EstimateResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/estimates/{estimate}/status": { + "post": { + "operationId": "estimates.changeStatus", + "tags": [ + "Estimates" + ], + "parameters": [ + { + "name": "estimate", + "in": "path", + "required": true, + "description": "The estimate ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/estimates/{estimate}/convert-to-invoice": { + "post": { + "operationId": "estimates.convertToInvoice", + "tags": [ + "Estimates" + ], + "parameters": [ + { + "name": "estimate", + "in": "path", + "required": true, + "description": "The estimate ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`InvoiceResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/InvoiceResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/estimates/delete": { + "post": { + "operationId": "estimates.delete", + "tags": [ + "Estimates" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteEstimatesRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/estimates": { + "get": { + "operationId": "estimates.index", + "tags": [ + "Estimates" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `EstimateResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EstimateResource" + } + }, + "meta": { + "type": "object", + "properties": { + "estimate_total_count": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "estimate_total_count" + ] + } + }, + "required": [ + "data", + "meta" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "estimates.store", + "tags": [ + "Estimates" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EstimatesRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`EstimateResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/EstimateResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/estimates/{estimate}": { + "get": { + "operationId": "estimates.show", + "tags": [ + "Estimates" + ], + "parameters": [ + { + "name": "estimate", + "in": "path", + "required": true, + "description": "The estimate ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`EstimateResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/EstimateResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "estimates.update", + "tags": [ + "Estimates" + ], + "parameters": [ + { + "name": "estimate", + "in": "path", + "required": true, + "description": "The estimate ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`EstimateResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/EstimateResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/{company}/customer/estimates": { + "get": { + "operationId": "customerPortal.estimate.estimates.index", + "summary": "Display a listing of the resource", + "tags": [ + "Estimates" + ], + "parameters": [ + { + "name": "company", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `App.Http.Resources.Customer.EstimateResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.EstimateResource" + } + }, + "meta": { + "type": "object", + "properties": { + "estimateTotalCount": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "estimateTotalCount" + ] + } + }, + "required": [ + "data", + "meta" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/{company}/customer/estimates/{id}": { + "get": { + "operationId": "customerPortal.estimate.estimates.show", + "summary": "Display the specified resource", + "tags": [ + "Estimates" + ], + "parameters": [ + { + "name": "company", + "in": "path", + "required": true, + "description": "The company slug", + "schema": { + "type": [ + "string", + "null" + ] + } + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/currencies/used": { + "get": { + "operationId": "exchangeRateProvider.usedCurrenciesWithoutRate", + "tags": [ + "ExchangeRateProvider" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "currencies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Currency" + } + } + }, + "required": [ + "currencies" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/currencies/bulk-update-exchange-rate": { + "post": { + "operationId": "exchangeRateProvider.bulkUpdate", + "tags": [ + "ExchangeRateProvider" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkExchangeRateRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "error": { + "type": "boolean" + } + }, + "required": [ + "error" + ] + }, + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/currencies/{currency}/exchange-rate": { + "get": { + "operationId": "exchangeRateProvider.getRate", + "tags": [ + "ExchangeRateProvider" + ], + "parameters": [ + { + "name": "currency", + "in": "path", + "required": true, + "description": "The currency ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "error": { + "type": "string", + "const": "no_exchange_rate_available" + } + }, + "required": [ + "error" + ] + }, + { + "type": "object", + "properties": { + "exchangeRate": { + "type": "array", + "prefixItems": [ + {} + ], + "minItems": 1, + "maxItems": 1, + "additionalItems": false + } + }, + "required": [ + "exchangeRate" + ] + }, + { + "type": "string" + }, + { + "type": "object", + "properties": { + "exchangeRate": { + "type": "array", + "items": {} + } + }, + "required": [ + "exchangeRate" + ] + } + ] + } + } + } + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/currencies/{currency}/active-provider": { + "get": { + "operationId": "exchangeRateProvider.activeProvider", + "tags": [ + "ExchangeRateProvider" + ], + "parameters": [ + { + "name": "currency", + "in": "path", + "required": true, + "description": "The currency ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "error": { + "type": "string", + "const": "no_active_provider" + } + }, + "required": [ + "error" + ] + }, + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "message": { + "type": "string", + "const": "provider_active" + } + }, + "required": [ + "success", + "message" + ] + } + ] + } + } + } + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/used-currencies": { + "get": { + "operationId": "exchangeRateProvider.usedCurrencies", + "tags": [ + "ExchangeRateProvider" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "allUsedCurrencies": { + "type": "array", + "items": { + "type": "string" + } + }, + "activeUsedCurrencies": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "allUsedCurrencies", + "activeUsedCurrencies" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/supported-currencies": { + "get": { + "operationId": "exchangeRateProvider.supportedCurrencies", + "tags": [ + "ExchangeRateProvider" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "supportedCurrencies": { + "type": "array", + "items": {} + } + }, + "required": [ + "supportedCurrencies" + ] + } + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/exchange-rate-providers": { + "get": { + "operationId": "exchange-rate-providers.index", + "summary": "Display a listing of the resource", + "tags": [ + "ExchangeRateProvider" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Paginated set of `ExchangeRateProviderResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExchangeRateProviderResource" + } + }, + "links": { + "type": "object", + "properties": { + "first": { + "type": [ + "string", + "null" + ] + }, + "last": { + "type": [ + "string", + "null" + ] + }, + "prev": { + "type": [ + "string", + "null" + ] + }, + "next": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "first", + "last", + "prev", + "next" + ] + }, + "meta": { + "type": "object", + "properties": { + "current_page": { + "type": "integer", + "minimum": 1 + }, + "from": { + "type": [ + "integer", + "null" + ], + "minimum": 1 + }, + "last_page": { + "type": "integer", + "minimum": 1 + }, + "links": { + "type": "array", + "description": "Generated paginator links.", + "items": { + "type": "object", + "properties": { + "url": { + "type": [ + "string", + "null" + ] + }, + "label": { + "type": "string" + }, + "active": { + "type": "boolean" + } + }, + "required": [ + "url", + "label", + "active" + ] + } + }, + "path": { + "type": [ + "string", + "null" + ], + "description": "Base path for paginator generated URLs." + }, + "per_page": { + "type": "integer", + "description": "Number of items shown per page.", + "minimum": 0 + }, + "to": { + "type": [ + "integer", + "null" + ], + "description": "Number of the last item in the slice.", + "minimum": 1 + }, + "total": { + "type": "integer", + "description": "Total number of items being paginated.", + "minimum": 0 + } + }, + "required": [ + "current_page", + "from", + "last_page", + "links", + "path", + "per_page", + "to", + "total" + ] + } + }, + "required": [ + "data", + "links", + "meta" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "exchange-rate-providers.store", + "summary": "Store a newly created resource in storage", + "tags": [ + "ExchangeRateProvider" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExchangeRateProviderRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/exchange-rate-providers/{exchangeRateProvider}": { + "get": { + "operationId": "exchange-rate-providers.show", + "summary": "Display the specified resource", + "tags": [ + "ExchangeRateProvider" + ], + "parameters": [ + { + "name": "exchangeRateProvider", + "in": "path", + "required": true, + "description": "The exchange rate provider ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`ExchangeRateProviderResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ExchangeRateProviderResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "exchange-rate-providers.update", + "summary": "Update the specified resource in storage", + "tags": [ + "ExchangeRateProvider" + ], + "parameters": [ + { + "name": "exchangeRateProvider", + "in": "path", + "required": true, + "description": "The exchange rate provider ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExchangeRateProviderRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + }, + "delete": { + "operationId": "exchange-rate-providers.destroy", + "summary": "Remove the specified resource from storage", + "tags": [ + "ExchangeRateProvider" + ], + "parameters": [ + { + "name": "exchangeRateProvider", + "in": "path", + "required": true, + "description": "The exchange rate provider ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/categories": { + "get": { + "operationId": "categories.index", + "summary": "Display a listing of the resource", + "tags": [ + "ExpenseCategories" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `ExpenseCategoryResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExpenseCategoryResource" + } + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "categories.store", + "summary": "Store a newly created resource in storage", + "tags": [ + "ExpenseCategories" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExpenseCategoryRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`ExpenseCategoryResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ExpenseCategoryResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/categories/{category}": { + "get": { + "operationId": "categories.show", + "summary": "Display the specified resource", + "tags": [ + "ExpenseCategories" + ], + "parameters": [ + { + "name": "category", + "in": "path", + "required": true, + "description": "The category ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`ExpenseCategoryResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ExpenseCategoryResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "categories.update", + "summary": "Update the specified resource in storage", + "tags": [ + "ExpenseCategories" + ], + "parameters": [ + { + "name": "category", + "in": "path", + "required": true, + "description": "The category ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExpenseCategoryRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`ExpenseCategoryResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ExpenseCategoryResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + }, + "delete": { + "operationId": "categories.destroy", + "summary": "Remove the specified resource from storage", + "tags": [ + "ExpenseCategories" + ], + "parameters": [ + { + "name": "category", + "in": "path", + "required": true, + "description": "The category ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/expenses/{expense}/show/receipt": { + "get": { + "operationId": "expenses.showReceipt", + "tags": [ + "Expenses" + ], + "parameters": [ + { + "name": "expense", + "in": "path", + "required": true, + "description": "The expense ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "string" + } + }, + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/expenses/{expense}/upload/receipts": { + "post": { + "operationId": "expenses.uploadReceipt", + "tags": [ + "Expenses" + ], + "parameters": [ + { + "name": "expense", + "in": "path", + "required": true, + "description": "The expense ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UploadExpenseReceiptRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "string", + "const": "Expense receipts uploaded successfully" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/expenses/delete": { + "post": { + "operationId": "expenses.delete", + "tags": [ + "Expenses" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteExpensesRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/expenses": { + "get": { + "operationId": "expenses.index", + "summary": "Display a listing of the resource", + "tags": [ + "Expenses" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `ExpenseResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExpenseResource" + } + }, + "meta": { + "type": "object", + "properties": { + "expense_total_count": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "expense_total_count" + ] + } + }, + "required": [ + "data", + "meta" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "expenses.store", + "summary": "Store a newly created resource in storage", + "tags": [ + "Expenses" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/ExpenseRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`ExpenseResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ExpenseResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/expenses/{expense}": { + "get": { + "operationId": "expenses.show", + "summary": "Display the specified resource", + "tags": [ + "Expenses" + ], + "parameters": [ + { + "name": "expense", + "in": "path", + "required": true, + "description": "The expense ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`ExpenseResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ExpenseResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "expenses.update", + "summary": "Update the specified resource in storage", + "tags": [ + "Expenses" + ], + "parameters": [ + { + "name": "expense", + "in": "path", + "required": true, + "description": "The expense ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/ExpenseRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`ExpenseResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ExpenseResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/{company}/customer/expenses": { + "get": { + "operationId": "customerPortal.expense.expenses.index", + "summary": "Display a listing of the resource", + "tags": [ + "Expenses" + ], + "parameters": [ + { + "name": "company", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `App.Http.Resources.Customer.ExpenseResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.ExpenseResource" + } + }, + "meta": { + "type": "object", + "properties": { + "expenseTotalCount": { + "type": "string" + } + }, + "required": [ + "expenseTotalCount" + ] + } + }, + "required": [ + "data", + "meta" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/{company}/customer/expenses/{id}": { + "get": { + "operationId": "customerPortal.expense.expenses.show", + "summary": "Display the specified resource", + "tags": [ + "Expenses" + ], + "parameters": [ + { + "name": "company", + "in": "path", + "required": true, + "description": "The company slug", + "schema": { + "type": [ + "string", + "null" + ] + } + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/installation/permissions": { + "get": { + "operationId": "filePermissions.permissions", + "summary": "Display the permissions check page", + "tags": [ + "FilePermissions" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "permissions": { + "type": "string" + } + }, + "required": [ + "permissions" + ] + } + } + } + } + } + } + }, + "/installation/finish": { + "post": { + "operationId": "setup.finish", + "summary": "Handle the incoming request", + "tags": [ + "Finish" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + } + } + } + }, + "/fonts/status": { + "get": { + "operationId": "font.status", + "tags": [ + "Font" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "packages": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "family": { + "type": "string" + }, + "locales": { + "type": "string" + }, + "size": { + "type": "string" + }, + "installed": { + "type": "boolean" + }, + "bundled": { + "type": "boolean" + } + }, + "required": [ + "key", + "name", + "family", + "locales", + "size", + "installed", + "bundled" + ] + } + } + }, + "required": [ + "packages" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/fonts/{package}/install": { + "post": { + "operationId": "font.install", + "tags": [ + "Font" + ], + "parameters": [ + { + "name": "package", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "500": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "error": { + "type": "string" + } + }, + "required": [ + "success", + "error" + ] + } + } + } + }, + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "installed": { + "type": "boolean" + } + }, + "required": [ + "success", + "installed" + ] + }, + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "message": { + "type": "string", + "const": "Already installed" + } + }, + "required": [ + "success", + "message" + ] + } + ] + } + } + } + }, + "404": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string", + "const": "Unknown font package" + } + }, + "required": [ + "error" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/auth/password/email": { + "post": { + "operationId": "company.auth.forgotPassword.sendResetLinkEmail", + "summary": "Send a reset link to the given user", + "tags": [ + "ForgotPassword" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "const": "Password reset email sent." + }, + "data": { + "type": "string" + } + }, + "required": [ + "message", + "data" + ] + } + } + } + }, + "403": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string", + "const": "Email could not be sent to this email address." + } + }, + "required": [ + "error" + ] + } + } + } + } + } + } + }, + "/{company}/customer/auth/password/email": { + "post": { + "operationId": "customerPortal.auth.forgotPassword.sendResetLinkEmail", + "summary": "Send a reset link to the given user", + "tags": [ + "ForgotPassword" + ], + "parameters": [ + { + "name": "company", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "message": { + "type": "string", + "const": "Password reset email sent." + }, + "data": { + "type": "string" + } + }, + "required": [ + "message", + "data" + ] + }, + { + "type": "object" + } + ] + } + } + } + } + } + } + }, + "/timezones": { + "get": { + "operationId": "formats.timezones", + "tags": [ + "Formats" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "time_zones": { + "type": "array", + "prefixItems": [ + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Midway" + }, + "key": { + "type": "string", + "const": "(UTC-11:00) Midway" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Niue" + }, + "key": { + "type": "string", + "const": "(UTC-11:00) Niue" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Pago_Pago" + }, + "key": { + "type": "string", + "const": "(UTC-11:00) Pago Pago" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Adak" + }, + "key": { + "type": "string", + "const": "(UTC-10:00) Adak" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Honolulu" + }, + "key": { + "type": "string", + "const": "(UTC-10:00) Honolulu" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Johnston" + }, + "key": { + "type": "string", + "const": "(UTC-10:00) Johnston" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Rarotonga" + }, + "key": { + "type": "string", + "const": "(UTC-10:00) Rarotonga" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Tahiti" + }, + "key": { + "type": "string", + "const": "(UTC-10:00) Tahiti" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Marquesas" + }, + "key": { + "type": "string", + "const": "(UTC-09:30) Marquesas" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Anchorage" + }, + "key": { + "type": "string", + "const": "(UTC-09:00) Anchorage" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Gambier" + }, + "key": { + "type": "string", + "const": "(UTC-09:00) Gambier" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Juneau" + }, + "key": { + "type": "string", + "const": "(UTC-09:00) Juneau" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Nome" + }, + "key": { + "type": "string", + "const": "(UTC-09:00) Nome" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Sitka" + }, + "key": { + "type": "string", + "const": "(UTC-09:00) Sitka" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Yakutat" + }, + "key": { + "type": "string", + "const": "(UTC-09:00) Yakutat" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Dawson" + }, + "key": { + "type": "string", + "const": "(UTC-08:00) Dawson" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Los_Angeles" + }, + "key": { + "type": "string", + "const": "(UTC-08:00) Los Angeles" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Metlakatla" + }, + "key": { + "type": "string", + "const": "(UTC-08:00) Metlakatla" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Pitcairn" + }, + "key": { + "type": "string", + "const": "(UTC-08:00) Pitcairn" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Santa_Isabel" + }, + "key": { + "type": "string", + "const": "(UTC-08:00) Santa Isabel" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Tijuana" + }, + "key": { + "type": "string", + "const": "(UTC-08:00) Tijuana" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Vancouver" + }, + "key": { + "type": "string", + "const": "(UTC-08:00) Vancouver" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Whitehorse" + }, + "key": { + "type": "string", + "const": "(UTC-08:00) Whitehorse" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Boise" + }, + "key": { + "type": "string", + "const": "(UTC-07:00) Boise" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Cambridge_Bay" + }, + "key": { + "type": "string", + "const": "(UTC-07:00) Cambridge Bay" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Chihuahua" + }, + "key": { + "type": "string", + "const": "(UTC-07:00) Chihuahua" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Creston" + }, + "key": { + "type": "string", + "const": "(UTC-07:00) Creston" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Dawson_Creek" + }, + "key": { + "type": "string", + "const": "(UTC-07:00) Dawson Creek" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Denver" + }, + "key": { + "type": "string", + "const": "(UTC-07:00) Denver" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Edmonton" + }, + "key": { + "type": "string", + "const": "(UTC-07:00) Edmonton" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Hermosillo" + }, + "key": { + "type": "string", + "const": "(UTC-07:00) Hermosillo" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Inuvik" + }, + "key": { + "type": "string", + "const": "(UTC-07:00) Inuvik" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Mazatlan" + }, + "key": { + "type": "string", + "const": "(UTC-07:00) Mazatlan" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Ojinaga" + }, + "key": { + "type": "string", + "const": "(UTC-07:00) Ojinaga" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Phoenix" + }, + "key": { + "type": "string", + "const": "(UTC-07:00) Phoenix" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Shiprock" + }, + "key": { + "type": "string", + "const": "(UTC-07:00) Shiprock" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Yellowknife" + }, + "key": { + "type": "string", + "const": "(UTC-07:00) Yellowknife" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Bahia_Banderas" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Bahia Banderas" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Belize" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Belize" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/North_Dakota/Beulah" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Beulah" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Cancun" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Cancun" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/North_Dakota/Center" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Center" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Chicago" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Chicago" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Costa_Rica" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Costa Rica" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Easter" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Easter" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/El_Salvador" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) El Salvador" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Galapagos" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Galapagos" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Guatemala" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Guatemala" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Indiana/Knox" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Knox" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Managua" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Managua" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Matamoros" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Matamoros" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Menominee" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Menominee" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Merida" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Merida" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Mexico_City" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Mexico City" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Monterrey" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Monterrey" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/North_Dakota/New_Salem" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) New Salem" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Rainy_River" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Rainy River" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Rankin_Inlet" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Rankin Inlet" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Regina" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Regina" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Resolute" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Resolute" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Swift_Current" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Swift Current" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Tegucigalpa" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Tegucigalpa" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Indiana/Tell_City" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Tell City" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Winnipeg" + }, + "key": { + "type": "string", + "const": "(UTC-06:00) Winnipeg" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Atikokan" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Atikokan" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Bogota" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Bogota" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Cayman" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Cayman" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Detroit" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Detroit" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Grand_Turk" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Grand Turk" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Guayaquil" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Guayaquil" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Havana" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Havana" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Indiana/Indianapolis" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Indianapolis" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Iqaluit" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Iqaluit" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Jamaica" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Jamaica" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Lima" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Lima" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Kentucky/Louisville" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Louisville" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Indiana/Marengo" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Marengo" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Kentucky/Monticello" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Monticello" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Montreal" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Montreal" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Nassau" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Nassau" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/New_York" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) New York" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Nipigon" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Nipigon" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Panama" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Panama" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Pangnirtung" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Pangnirtung" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Indiana/Petersburg" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Petersburg" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Port-au-Prince" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Port-au-Prince" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Thunder_Bay" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Thunder Bay" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Toronto" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Toronto" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Indiana/Vevay" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Vevay" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Indiana/Vincennes" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Vincennes" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Indiana/Winamac" + }, + "key": { + "type": "string", + "const": "(UTC-05:00) Winamac" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Caracas" + }, + "key": { + "type": "string", + "const": "(UTC-04:30) Caracas" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Anguilla" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Anguilla" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Antigua" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Antigua" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Aruba" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Aruba" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Asuncion" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Asuncion" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Barbados" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Barbados" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Atlantic/Bermuda" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Bermuda" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Blanc-Sablon" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Blanc-Sablon" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Boa_Vista" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Boa Vista" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Campo_Grande" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Campo Grande" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Cuiaba" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Cuiaba" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Curacao" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Curacao" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Dominica" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Dominica" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Eirunepe" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Eirunepe" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Glace_Bay" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Glace Bay" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Goose_Bay" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Goose Bay" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Grenada" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Grenada" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Guadeloupe" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Guadeloupe" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Guyana" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Guyana" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Halifax" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Halifax" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Kralendijk" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Kralendijk" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/La_Paz" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) La Paz" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Lower_Princes" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Lower Princes" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Manaus" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Manaus" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Marigot" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Marigot" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Martinique" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Martinique" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Moncton" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Moncton" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Montserrat" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Montserrat" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Antarctica/Palmer" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Palmer" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Port_of_Spain" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Port of Spain" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Porto_Velho" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Porto Velho" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Puerto_Rico" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Puerto Rico" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Rio_Branco" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Rio Branco" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Santiago" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Santiago" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Santo_Domingo" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Santo Domingo" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/St_Barthelemy" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) St. Barthelemy" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/St_Kitts" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) St. Kitts" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/St_Lucia" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) St. Lucia" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/St_Thomas" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) St. Thomas" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/St_Vincent" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) St. Vincent" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Thule" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Thule" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Tortola" + }, + "key": { + "type": "string", + "const": "(UTC-04:00) Tortola" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/St_Johns" + }, + "key": { + "type": "string", + "const": "(UTC-03:30) St. Johns" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Araguaina" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Araguaina" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Bahia" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Bahia" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Belem" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Belem" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Argentina/Buenos_Aires" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Buenos Aires" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Argentina/Catamarca" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Catamarca" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Cayenne" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Cayenne" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Argentina/Cordoba" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Cordoba" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Fortaleza" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Fortaleza" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Godthab" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Godthab" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Argentina/Jujuy" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Jujuy" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Argentina/La_Rioja" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) La Rioja" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Maceio" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Maceio" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Argentina/Mendoza" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Mendoza" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Miquelon" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Miquelon" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Montevideo" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Montevideo" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Paramaribo" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Paramaribo" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Recife" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Recife" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Argentina/Rio_Gallegos" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Rio Gallegos" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Antarctica/Rothera" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Rothera" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Argentina/Salta" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Salta" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Argentina/San_Juan" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) San Juan" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Argentina/San_Luis" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) San Luis" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Santarem" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Santarem" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Sao_Paulo" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Sao Paulo" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Atlantic/Stanley" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Stanley" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Argentina/Tucuman" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Tucuman" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Argentina/Ushuaia" + }, + "key": { + "type": "string", + "const": "(UTC-03:00) Ushuaia" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Noronha" + }, + "key": { + "type": "string", + "const": "(UTC-02:00) Noronha" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Atlantic/South_Georgia" + }, + "key": { + "type": "string", + "const": "(UTC-02:00) South Georgia" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Atlantic/Azores" + }, + "key": { + "type": "string", + "const": "(UTC-01:00) Azores" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Atlantic/Cape_Verde" + }, + "key": { + "type": "string", + "const": "(UTC-01:00) Cape Verde" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Scoresbysund" + }, + "key": { + "type": "string", + "const": "(UTC-01:00) Scoresbysund" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Abidjan" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Abidjan" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Accra" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Accra" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Bamako" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Bamako" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Banjul" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Banjul" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Bissau" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Bissau" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Atlantic/Canary" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Canary" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Casablanca" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Casablanca" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Conakry" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Conakry" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Dakar" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Dakar" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "America/Danmarkshavn" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Danmarkshavn" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Dublin" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Dublin" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/El_Aaiun" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) El Aaiun" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Atlantic/Faroe" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Faroe" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Freetown" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Freetown" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Guernsey" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Guernsey" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Isle_of_Man" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Isle of Man" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Jersey" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Jersey" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Lisbon" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Lisbon" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Lome" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Lome" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/London" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) London" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Atlantic/Madeira" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Madeira" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Monrovia" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Monrovia" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Nouakchott" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Nouakchott" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Ouagadougou" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Ouagadougou" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Atlantic/Reykjavik" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Reykjavik" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Sao_Tome" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) Sao Tome" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Atlantic/St_Helena" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) St. Helena" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "UTC" + }, + "key": { + "type": "string", + "const": "(UTC+00:00) UTC" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Algiers" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Algiers" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Amsterdam" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Amsterdam" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Andorra" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Andorra" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Bangui" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Bangui" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Belgrade" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Belgrade" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Berlin" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Berlin" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Bratislava" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Bratislava" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Brazzaville" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Brazzaville" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Brussels" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Brussels" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Budapest" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Budapest" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Busingen" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Busingen" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Ceuta" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Ceuta" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Copenhagen" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Copenhagen" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Douala" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Douala" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Gibraltar" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Gibraltar" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Kinshasa" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Kinshasa" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Lagos" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Lagos" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Libreville" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Libreville" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Ljubljana" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Ljubljana" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Arctic/Longyearbyen" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Longyearbyen" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Luanda" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Luanda" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Luxembourg" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Luxembourg" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Madrid" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Madrid" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Malabo" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Malabo" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Malta" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Malta" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Monaco" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Monaco" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Ndjamena" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Ndjamena" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Niamey" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Niamey" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Oslo" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Oslo" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Paris" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Paris" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Podgorica" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Podgorica" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Porto-Novo" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Porto-Novo" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Prague" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Prague" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Rome" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Rome" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/San_Marino" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) San Marino" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Sarajevo" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Sarajevo" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Skopje" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Skopje" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Stockholm" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Stockholm" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Tirane" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Tirane" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Tripoli" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Tripoli" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Tunis" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Tunis" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Vaduz" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Vaduz" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Vatican" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Vatican" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Vienna" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Vienna" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Warsaw" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Warsaw" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Windhoek" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Windhoek" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Zagreb" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Zagreb" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Zurich" + }, + "key": { + "type": "string", + "const": "(UTC+01:00) Zurich" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Athens" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Athens" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Beirut" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Beirut" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Blantyre" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Blantyre" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Bucharest" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Bucharest" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Bujumbura" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Bujumbura" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Cairo" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Cairo" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Chisinau" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Chisinau" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Damascus" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Damascus" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Gaborone" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Gaborone" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Gaza" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Gaza" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Harare" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Harare" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Hebron" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Hebron" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Helsinki" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Helsinki" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Istanbul" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Istanbul" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Jerusalem" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Jerusalem" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Johannesburg" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Johannesburg" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Kiev" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Kiev" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Kigali" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Kigali" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Lubumbashi" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Lubumbashi" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Lusaka" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Lusaka" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Maputo" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Maputo" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Mariehamn" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Mariehamn" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Maseru" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Maseru" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Mbabane" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Mbabane" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Nicosia" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Nicosia" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Riga" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Riga" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Simferopol" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Simferopol" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Sofia" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Sofia" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Tallinn" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Tallinn" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Uzhgorod" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Uzhgorod" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Vilnius" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Vilnius" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Zaporozhye" + }, + "key": { + "type": "string", + "const": "(UTC+02:00) Zaporozhye" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Addis_Ababa" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Addis Ababa" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Aden" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Aden" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Amman" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Amman" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Indian/Antananarivo" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Antananarivo" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Asmara" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Asmara" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Baghdad" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Baghdad" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Bahrain" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Bahrain" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Indian/Comoro" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Comoro" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Dar_es_Salaam" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Dar es Salaam" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Djibouti" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Djibouti" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Juba" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Juba" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Kaliningrad" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Kaliningrad" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Kampala" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Kampala" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Khartoum" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Khartoum" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Kuwait" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Kuwait" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Indian/Mayotte" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Mayotte" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Minsk" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Minsk" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Mogadishu" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Mogadishu" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Africa/Nairobi" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Nairobi" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Qatar" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Qatar" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Riyadh" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Riyadh" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Antarctica/Syowa" + }, + "key": { + "type": "string", + "const": "(UTC+03:00) Syowa" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Tehran" + }, + "key": { + "type": "string", + "const": "(UTC+03:30) Tehran" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Baku" + }, + "key": { + "type": "string", + "const": "(UTC+04:00) Baku" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Dubai" + }, + "key": { + "type": "string", + "const": "(UTC+04:00) Dubai" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Indian/Mahe" + }, + "key": { + "type": "string", + "const": "(UTC+04:00) Mahe" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Indian/Mauritius" + }, + "key": { + "type": "string", + "const": "(UTC+04:00) Mauritius" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Moscow" + }, + "key": { + "type": "string", + "const": "(UTC+04:00) Moscow" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Muscat" + }, + "key": { + "type": "string", + "const": "(UTC+04:00) Muscat" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Indian/Reunion" + }, + "key": { + "type": "string", + "const": "(UTC+04:00) Reunion" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Samara" + }, + "key": { + "type": "string", + "const": "(UTC+04:00) Samara" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Tbilisi" + }, + "key": { + "type": "string", + "const": "(UTC+04:00) Tbilisi" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Europe/Volgograd" + }, + "key": { + "type": "string", + "const": "(UTC+04:00) Volgograd" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Yerevan" + }, + "key": { + "type": "string", + "const": "(UTC+04:00) Yerevan" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Kabul" + }, + "key": { + "type": "string", + "const": "(UTC+04:30) Kabul" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Aqtau" + }, + "key": { + "type": "string", + "const": "(UTC+05:00) Aqtau" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Aqtobe" + }, + "key": { + "type": "string", + "const": "(UTC+05:00) Aqtobe" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Ashgabat" + }, + "key": { + "type": "string", + "const": "(UTC+05:00) Ashgabat" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Dushanbe" + }, + "key": { + "type": "string", + "const": "(UTC+05:00) Dushanbe" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Karachi" + }, + "key": { + "type": "string", + "const": "(UTC+05:00) Karachi" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Indian/Kerguelen" + }, + "key": { + "type": "string", + "const": "(UTC+05:00) Kerguelen" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Indian/Maldives" + }, + "key": { + "type": "string", + "const": "(UTC+05:00) Maldives" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Antarctica/Mawson" + }, + "key": { + "type": "string", + "const": "(UTC+05:00) Mawson" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Oral" + }, + "key": { + "type": "string", + "const": "(UTC+05:00) Oral" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Samarkand" + }, + "key": { + "type": "string", + "const": "(UTC+05:00) Samarkand" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Tashkent" + }, + "key": { + "type": "string", + "const": "(UTC+05:00) Tashkent" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Colombo" + }, + "key": { + "type": "string", + "const": "(UTC+05:30) Colombo" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Kolkata" + }, + "key": { + "type": "string", + "const": "(UTC+05:30) Kolkata" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Kathmandu" + }, + "key": { + "type": "string", + "const": "(UTC+05:45) Kathmandu" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Almaty" + }, + "key": { + "type": "string", + "const": "(UTC+06:00) Almaty" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Bishkek" + }, + "key": { + "type": "string", + "const": "(UTC+06:00) Bishkek" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Indian/Chagos" + }, + "key": { + "type": "string", + "const": "(UTC+06:00) Chagos" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Dhaka" + }, + "key": { + "type": "string", + "const": "(UTC+06:00) Dhaka" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Qyzylorda" + }, + "key": { + "type": "string", + "const": "(UTC+06:00) Qyzylorda" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Thimphu" + }, + "key": { + "type": "string", + "const": "(UTC+06:00) Thimphu" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Antarctica/Vostok" + }, + "key": { + "type": "string", + "const": "(UTC+06:00) Vostok" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Yekaterinburg" + }, + "key": { + "type": "string", + "const": "(UTC+06:00) Yekaterinburg" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Indian/Cocos" + }, + "key": { + "type": "string", + "const": "(UTC+06:30) Cocos" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Rangoon" + }, + "key": { + "type": "string", + "const": "(UTC+06:30) Rangoon" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Bangkok" + }, + "key": { + "type": "string", + "const": "(UTC+07:00) Bangkok" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Indian/Christmas" + }, + "key": { + "type": "string", + "const": "(UTC+07:00) Christmas" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Antarctica/Davis" + }, + "key": { + "type": "string", + "const": "(UTC+07:00) Davis" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Ho_Chi_Minh" + }, + "key": { + "type": "string", + "const": "(UTC+07:00) Ho Chi Minh" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Hovd" + }, + "key": { + "type": "string", + "const": "(UTC+07:00) Hovd" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Jakarta" + }, + "key": { + "type": "string", + "const": "(UTC+07:00) Jakarta" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Novokuznetsk" + }, + "key": { + "type": "string", + "const": "(UTC+07:00) Novokuznetsk" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Novosibirsk" + }, + "key": { + "type": "string", + "const": "(UTC+07:00) Novosibirsk" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Omsk" + }, + "key": { + "type": "string", + "const": "(UTC+07:00) Omsk" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Phnom_Penh" + }, + "key": { + "type": "string", + "const": "(UTC+07:00) Phnom Penh" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Pontianak" + }, + "key": { + "type": "string", + "const": "(UTC+07:00) Pontianak" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Vientiane" + }, + "key": { + "type": "string", + "const": "(UTC+07:00) Vientiane" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Brunei" + }, + "key": { + "type": "string", + "const": "(UTC+08:00) Brunei" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Antarctica/Casey" + }, + "key": { + "type": "string", + "const": "(UTC+08:00) Casey" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Choibalsan" + }, + "key": { + "type": "string", + "const": "(UTC+08:00) Choibalsan" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Chongqing" + }, + "key": { + "type": "string", + "const": "(UTC+08:00) Chongqing" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Harbin" + }, + "key": { + "type": "string", + "const": "(UTC+08:00) Harbin" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Hong_Kong" + }, + "key": { + "type": "string", + "const": "(UTC+08:00) Hong Kong" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Kashgar" + }, + "key": { + "type": "string", + "const": "(UTC+08:00) Kashgar" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Krasnoyarsk" + }, + "key": { + "type": "string", + "const": "(UTC+08:00) Krasnoyarsk" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Kuala_Lumpur" + }, + "key": { + "type": "string", + "const": "(UTC+08:00) Kuala Lumpur" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Kuching" + }, + "key": { + "type": "string", + "const": "(UTC+08:00) Kuching" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Macau" + }, + "key": { + "type": "string", + "const": "(UTC+08:00) Macau" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Makassar" + }, + "key": { + "type": "string", + "const": "(UTC+08:00) Makassar" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Manila" + }, + "key": { + "type": "string", + "const": "(UTC+08:00) Manila" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Australia/Perth" + }, + "key": { + "type": "string", + "const": "(UTC+08:00) Perth" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Shanghai" + }, + "key": { + "type": "string", + "const": "(UTC+08:00) Shanghai" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Singapore" + }, + "key": { + "type": "string", + "const": "(UTC+08:00) Singapore" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Taipei" + }, + "key": { + "type": "string", + "const": "(UTC+08:00) Taipei" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Ulaanbaatar" + }, + "key": { + "type": "string", + "const": "(UTC+08:00) Ulaanbaatar" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Urumqi" + }, + "key": { + "type": "string", + "const": "(UTC+08:00) Urumqi" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Australia/Eucla" + }, + "key": { + "type": "string", + "const": "(UTC+08:45) Eucla" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Dili" + }, + "key": { + "type": "string", + "const": "(UTC+09:00) Dili" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Irkutsk" + }, + "key": { + "type": "string", + "const": "(UTC+09:00) Irkutsk" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Jayapura" + }, + "key": { + "type": "string", + "const": "(UTC+09:00) Jayapura" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Palau" + }, + "key": { + "type": "string", + "const": "(UTC+09:00) Palau" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Pyongyang" + }, + "key": { + "type": "string", + "const": "(UTC+09:00) Pyongyang" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Seoul" + }, + "key": { + "type": "string", + "const": "(UTC+09:00) Seoul" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Tokyo" + }, + "key": { + "type": "string", + "const": "(UTC+09:00) Tokyo" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Australia/Adelaide" + }, + "key": { + "type": "string", + "const": "(UTC+09:30) Adelaide" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Australia/Broken_Hill" + }, + "key": { + "type": "string", + "const": "(UTC+09:30) Broken Hill" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Australia/Darwin" + }, + "key": { + "type": "string", + "const": "(UTC+09:30) Darwin" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Australia/Brisbane" + }, + "key": { + "type": "string", + "const": "(UTC+10:00) Brisbane" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Chuuk" + }, + "key": { + "type": "string", + "const": "(UTC+10:00) Chuuk" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Australia/Currie" + }, + "key": { + "type": "string", + "const": "(UTC+10:00) Currie" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Antarctica/DumontDUrville" + }, + "key": { + "type": "string", + "const": "(UTC+10:00) DumontDUrville" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Guam" + }, + "key": { + "type": "string", + "const": "(UTC+10:00) Guam" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Australia/Hobart" + }, + "key": { + "type": "string", + "const": "(UTC+10:00) Hobart" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Khandyga" + }, + "key": { + "type": "string", + "const": "(UTC+10:00) Khandyga" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Australia/Lindeman" + }, + "key": { + "type": "string", + "const": "(UTC+10:00) Lindeman" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Australia/Melbourne" + }, + "key": { + "type": "string", + "const": "(UTC+10:00) Melbourne" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Port_Moresby" + }, + "key": { + "type": "string", + "const": "(UTC+10:00) Port Moresby" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Saipan" + }, + "key": { + "type": "string", + "const": "(UTC+10:00) Saipan" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Australia/Sydney" + }, + "key": { + "type": "string", + "const": "(UTC+10:00) Sydney" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Yakutsk" + }, + "key": { + "type": "string", + "const": "(UTC+10:00) Yakutsk" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Australia/Lord_Howe" + }, + "key": { + "type": "string", + "const": "(UTC+10:30) Lord Howe" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Efate" + }, + "key": { + "type": "string", + "const": "(UTC+11:00) Efate" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Guadalcanal" + }, + "key": { + "type": "string", + "const": "(UTC+11:00) Guadalcanal" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Kosrae" + }, + "key": { + "type": "string", + "const": "(UTC+11:00) Kosrae" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Antarctica/Macquarie" + }, + "key": { + "type": "string", + "const": "(UTC+11:00) Macquarie" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Noumea" + }, + "key": { + "type": "string", + "const": "(UTC+11:00) Noumea" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Pohnpei" + }, + "key": { + "type": "string", + "const": "(UTC+11:00) Pohnpei" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Sakhalin" + }, + "key": { + "type": "string", + "const": "(UTC+11:00) Sakhalin" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Ust-Nera" + }, + "key": { + "type": "string", + "const": "(UTC+11:00) Ust-Nera" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Vladivostok" + }, + "key": { + "type": "string", + "const": "(UTC+11:00) Vladivostok" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Norfolk" + }, + "key": { + "type": "string", + "const": "(UTC+11:30) Norfolk" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Anadyr" + }, + "key": { + "type": "string", + "const": "(UTC+12:00) Anadyr" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Auckland" + }, + "key": { + "type": "string", + "const": "(UTC+12:00) Auckland" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Fiji" + }, + "key": { + "type": "string", + "const": "(UTC+12:00) Fiji" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Funafuti" + }, + "key": { + "type": "string", + "const": "(UTC+12:00) Funafuti" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Kamchatka" + }, + "key": { + "type": "string", + "const": "(UTC+12:00) Kamchatka" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Kwajalein" + }, + "key": { + "type": "string", + "const": "(UTC+12:00) Kwajalein" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Asia/Magadan" + }, + "key": { + "type": "string", + "const": "(UTC+12:00) Magadan" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Majuro" + }, + "key": { + "type": "string", + "const": "(UTC+12:00) Majuro" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Antarctica/McMurdo" + }, + "key": { + "type": "string", + "const": "(UTC+12:00) McMurdo" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Nauru" + }, + "key": { + "type": "string", + "const": "(UTC+12:00) Nauru" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Antarctica/South_Pole" + }, + "key": { + "type": "string", + "const": "(UTC+12:00) South Pole" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Tarawa" + }, + "key": { + "type": "string", + "const": "(UTC+12:00) Tarawa" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Wake" + }, + "key": { + "type": "string", + "const": "(UTC+12:00) Wake" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Wallis" + }, + "key": { + "type": "string", + "const": "(UTC+12:00) Wallis" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Chatham" + }, + "key": { + "type": "string", + "const": "(UTC+12:45) Chatham" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Apia" + }, + "key": { + "type": "string", + "const": "(UTC+13:00) Apia" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Enderbury" + }, + "key": { + "type": "string", + "const": "(UTC+13:00) Enderbury" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Fakaofo" + }, + "key": { + "type": "string", + "const": "(UTC+13:00) Fakaofo" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Tongatapu" + }, + "key": { + "type": "string", + "const": "(UTC+13:00) Tongatapu" + } + }, + "required": [ + "value", + "key" + ] + }, + { + "type": "object", + "properties": { + "value": { + "type": "string", + "const": "Pacific/Kiritimati" + }, + "key": { + "type": "string", + "const": "(UTC+14:00) Kiritimati" + } + }, + "required": [ + "value", + "key" + ] + } + ], + "minItems": 419, + "maxItems": 419, + "additionalItems": false + } + }, + "required": [ + "time_zones" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/date/formats": { + "get": { + "operationId": "formats.dateFormats", + "tags": [ + "Formats" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "date_formats": { + "type": "array", + "items": { + "type": "object", + "properties": { + "display_date": { + "type": "string" + }, + "carbon_format_value": { + "type": "string" + }, + "moment_format_value": { + "type": "string" + } + }, + "required": [ + "display_date", + "carbon_format_value", + "moment_format_value" + ] + } + } + }, + "required": [ + "date_formats" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/time/formats": { + "get": { + "operationId": "formats.timeFormats", + "tags": [ + "Formats" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "time_formats": { + "type": "array", + "items": { + "type": "object", + "properties": { + "display_time": { + "type": "string" + }, + "carbon_format_value": { + "type": "string" + }, + "moment_format_value": { + "type": "string" + } + }, + "required": [ + "display_time", + "carbon_format_value", + "moment_format_value" + ] + } + } + }, + "required": [ + "time_formats" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/ai/generate": { + "post": { + "operationId": "ai.generation", + "description": "Stateless \u2014 nothing is persisted. Each call is fully self-contained.\nRate-limited via the shared 'ai' limiter so a stuck client can't\nhammer the provider.", + "summary": "One-shot text generation for the WYSIWYG popup", + "tags": [ + "Generation" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "prompt": { + "type": "string", + "maxLength": 4000 + }, + "context": { + "type": [ + "string", + "null" + ], + "maxLength": 20000 + } + }, + "required": [ + "prompt" + ] + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "text": { + "type": "string" + } + }, + "required": [ + "text" + ] + } + } + } + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/helloworlds": { + "get": { + "operationId": "helloworld.index", + "summary": "Display a listing of the resource", + "tags": [ + "HelloWorld" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "helloworld.store", + "summary": "Store a newly created resource in storage", + "tags": [ + "HelloWorld" + ], + "responses": { + "200": { + "description": "" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/helloworlds/{id}": { + "get": { + "operationId": "helloworld.show", + "summary": "Show the specified resource", + "tags": [ + "HelloWorld" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "helloworld.update", + "summary": "Update the specified resource in storage", + "tags": [ + "HelloWorld" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "delete": { + "operationId": "helloworld.destroy", + "summary": "Remove the specified resource from storage", + "tags": [ + "HelloWorld" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/company-invitations": { + "get": { + "operationId": "company-invitations.index", + "tags": [ + "Invitation" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "invitations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyInvitationResource" + } + } + }, + "required": [ + "invitations" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "company-invitations.store", + "tags": [ + "Invitation" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email" + }, + "role_id": { + "type": "integer" + } + }, + "required": [ + "email", + "role_id" + ] + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "invitation": { + "$ref": "#/components/schemas/CompanyInvitationResource" + } + }, + "required": [ + "success", + "invitation" + ] + } + } + } + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/company-invitations/{companyInvitation}": { + "delete": { + "operationId": "company-invitations.destroy", + "tags": [ + "Invitation" + ], + "parameters": [ + { + "name": "companyInvitation", + "in": "path", + "required": true, + "description": "The company invitation ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "422": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "message": { + "type": "string", + "const": "Only pending invitations can be cancelled." + } + }, + "required": [ + "success", + "message" + ] + } + } + } + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/invitations/{token}/details": { + "get": { + "operationId": "invitationRegistration.details", + "summary": "Get invitation details by token (public endpoint for registration page)", + "tags": [ + "InvitationRegistration" + ], + "parameters": [ + { + "name": "token", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "company_name": { + "type": "string" + }, + "role_name": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "email", + "company_name", + "role_name" + ] + } + } + } + }, + "404": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string", + "const": "Invitation not found or expired." + } + }, + "required": [ + "error" + ] + } + } + } + } + } + } + }, + "/auth/register-with-invitation": { + "post": { + "operationId": "invitationRegistration.register", + "summary": "Register a new user and auto-accept the invitation", + "tags": [ + "InvitationRegistration" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 255 + }, + "email": { + "type": "string", + "format": "email", + "maxLength": 255 + }, + "password": { + "type": "string", + "minLength": 8 + }, + "invitation_token": { + "type": "string" + }, + "password_confirmation": { + "type": "string", + "minLength": 8 + } + }, + "required": [ + "name", + "email", + "password", + "invitation_token", + "password_confirmation" + ] + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "Bearer" + }, + "token": { + "type": "string" + } + }, + "required": [ + "type", + "token" + ] + } + } + } + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/invitations/pending": { + "get": { + "operationId": "invitationResponse.pending", + "summary": "Get pending invitations for the authenticated user", + "tags": [ + "InvitationResponse" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "invitations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyInvitationResource" + } + } + }, + "required": [ + "invitations" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/invitations/{invitation}/accept": { + "post": { + "operationId": "invitationResponse.accept", + "summary": "Accept a company invitation", + "tags": [ + "InvitationResponse" + ], + "parameters": [ + { + "name": "invitation", + "in": "path", + "required": true, + "description": "The invitation token", + "schema": { + "type": "string" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/invitations/{invitation}/decline": { + "post": { + "operationId": "invitationResponse.decline", + "summary": "Decline a company invitation", + "tags": [ + "InvitationResponse" + ], + "parameters": [ + { + "name": "invitation", + "in": "path", + "required": true, + "description": "The invitation token", + "schema": { + "type": "string" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/invoices/templates": { + "get": { + "operationId": "invoice.invoiceTemplates", + "summary": "Handle the incoming request", + "tags": [ + "InvoiceTemplates" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "invoiceTemplates": { + "type": "array", + "items": {} + } + }, + "required": [ + "invoiceTemplates" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/invoices/{invoice}/send/preview": { + "get": { + "operationId": "invoices.sendPreview", + "tags": [ + "Invoices" + ], + "parameters": [ + { + "name": "invoice", + "in": "path", + "required": true, + "description": "The invoice ID", + "schema": { + "type": "integer" + } + }, + { + "name": "body", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "subject", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "from", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "to", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "cc", + "in": "query", + "schema": { + "type": [ + "string", + "null" + ] + } + }, + { + "name": "bcc", + "in": "query", + "schema": { + "type": [ + "string", + "null" + ] + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/invoices/{invoice}/send": { + "post": { + "operationId": "invoices.send", + "tags": [ + "Invoices" + ], + "parameters": [ + { + "name": "invoice", + "in": "path", + "required": true, + "description": "The invoice ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SendInvoiceRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/invoices/{invoice}/clone": { + "post": { + "operationId": "invoices.clone", + "tags": [ + "Invoices" + ], + "parameters": [ + { + "name": "invoice", + "in": "path", + "required": true, + "description": "The invoice ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`InvoiceResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/InvoiceResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/invoices/{invoice}/convert-to-estimate": { + "post": { + "operationId": "invoices.convertToEstimate", + "tags": [ + "Invoices" + ], + "parameters": [ + { + "name": "invoice", + "in": "path", + "required": true, + "description": "The invoice ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`EstimateResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/EstimateResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/invoices/{invoice}/status": { + "post": { + "operationId": "invoices.changeStatus", + "tags": [ + "Invoices" + ], + "parameters": [ + { + "name": "invoice", + "in": "path", + "required": true, + "description": "The invoice ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/invoices/delete": { + "post": { + "operationId": "invoices.delete", + "summary": "delete the specified resources in storage", + "tags": [ + "Invoices" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteInvoiceRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/invoices": { + "get": { + "operationId": "invoices.index", + "summary": "Display a listing of the resource", + "tags": [ + "Invoices" + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "schema": { + "type": "string", + "default": 10 + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `InvoiceResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InvoiceResource" + } + }, + "meta": { + "type": "object", + "properties": { + "invoice_total_count": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "invoice_total_count" + ] + } + }, + "required": [ + "data", + "meta" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "invoices.store", + "summary": "Store a newly created resource in storage", + "tags": [ + "Invoices" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvoicesRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`InvoiceResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/InvoiceResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/invoices/{invoice}": { + "get": { + "operationId": "invoices.show", + "summary": "Display the specified resource", + "tags": [ + "Invoices" + ], + "parameters": [ + { + "name": "invoice", + "in": "path", + "required": true, + "description": "The invoice ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`InvoiceResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/InvoiceResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "invoices.update", + "summary": "Update the specified resource in storage", + "tags": [ + "Invoices" + ], + "parameters": [ + { + "name": "invoice", + "in": "path", + "required": true, + "description": "The invoice ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`InvoiceResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/InvoiceResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/{company}/customer/invoices": { + "get": { + "operationId": "customerPortal.invoice.invoices.index", + "summary": "Display a listing of the resource", + "tags": [ + "Invoices" + ], + "parameters": [ + { + "name": "company", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `App.Http.Resources.Customer.InvoiceResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.InvoiceResource" + } + }, + "meta": { + "type": "object", + "properties": { + "invoiceTotalCount": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "invoiceTotalCount" + ] + } + }, + "required": [ + "data", + "meta" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/{company}/customer/invoices/{id}": { + "get": { + "operationId": "customerPortal.invoice.invoices.show", + "tags": [ + "Invoices" + ], + "parameters": [ + { + "name": "company", + "in": "path", + "required": true, + "description": "The company slug", + "schema": { + "type": [ + "string", + "null" + ] + } + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`App.Http.Resources.Customer.InvoiceResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.InvoiceResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/items/delete": { + "post": { + "operationId": "items.delete", + "summary": "Delete a list of existing Items", + "tags": [ + "Items" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteItemsRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/items": { + "get": { + "operationId": "items.index", + "summary": "Retrieve a list of existing Items", + "tags": [ + "Items" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `ItemResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ItemResource" + } + }, + "meta": { + "type": "object", + "properties": { + "tax_types": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TaxType" + } + }, + "item_total_count": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "tax_types", + "item_total_count" + ] + } + }, + "required": [ + "data", + "meta" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "items.store", + "summary": "Create Item", + "tags": [ + "Items" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ItemsRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`ItemResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ItemResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/items/{item}": { + "get": { + "operationId": "items.show", + "summary": "get an existing Item", + "tags": [ + "Items" + ], + "parameters": [ + { + "name": "item", + "in": "path", + "required": true, + "description": "The item ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`ItemResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ItemResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "items.update", + "summary": "Update an existing Item", + "tags": [ + "Items" + ], + "parameters": [ + { + "name": "item", + "in": "path", + "required": true, + "description": "The item ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ItemsRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`ItemResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ItemResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/installation/languages": { + "get": { + "operationId": "languages.languages", + "summary": "Display the languages page", + "tags": [ + "Languages" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "languages": { + "type": "string" + } + }, + "required": [ + "languages" + ] + } + } + } + } + } + } + }, + "/installation/login": { + "post": { + "operationId": "setup.login", + "tags": [ + "Login" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "type": { + "type": "string", + "const": "Bearer" + }, + "token": { + "type": "string" + }, + "user": { + "anyOf": [ + { + "$ref": "#/components/schemas/User" + }, + { + "type": "null" + } + ] + }, + "company": { + "allOf": [ + { + "$ref": "#/components/schemas/Company" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "success", + "type", + "token", + "user", + "company" + ] + } + } + } + }, + "422": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "const": "Super admin company not found." + } + }, + "required": [ + "message" + ] + } + } + } + }, + "404": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "const": "Super admin user not found." + } + }, + "required": [ + "message" + ] + } + } + } + } + } + } + }, + "/mail/drivers": { + "get": { + "operationId": "mailConfiguration.getMailDrivers", + "summary": "Return the available mail drivers", + "tags": [ + "MailConfiguration" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": {} + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/mail/config": { + "get": { + "operationId": "mailConfiguration.getMailEnvironment", + "summary": "Return the mail environment variables", + "tags": [ + "MailConfiguration" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": {} + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "mailConfiguration.saveMailEnvironment", + "summary": "Save the mail environment variables", + "tags": [ + "MailConfiguration" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MailEnvironmentRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "string", + "const": "mail_variables_save_successfully" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/mail/test": { + "post": { + "operationId": "mailConfiguration.testEmailConfig", + "summary": "Test the email configuration", + "tags": [ + "MailConfiguration" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "to": { + "type": "string", + "format": "email" + }, + "subject": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "to", + "subject", + "message" + ] + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/members/delete": { + "post": { + "operationId": "members.delete", + "summary": "Display a listing of the resource", + "tags": [ + "Members" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteMemberRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/members": { + "get": { + "operationId": "members.index", + "summary": "Display a listing of the resource", + "tags": [ + "Members" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Paginated set of `UserResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UserResource" + } + }, + "links": { + "type": "object", + "properties": { + "first": { + "type": [ + "string", + "null" + ] + }, + "last": { + "type": [ + "string", + "null" + ] + }, + "prev": { + "type": [ + "string", + "null" + ] + }, + "next": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "first", + "last", + "prev", + "next" + ] + }, + "meta": { + "type": "object", + "properties": { + "current_page": { + "type": "integer", + "minimum": 1 + }, + "from": { + "type": [ + "integer", + "null" + ], + "minimum": 1 + }, + "last_page": { + "type": "integer", + "minimum": 1 + }, + "links": { + "type": "array", + "description": "Generated paginator links.", + "items": { + "type": "object", + "properties": { + "url": { + "type": [ + "string", + "null" + ] + }, + "label": { + "type": "string" + }, + "active": { + "type": "boolean" + } + }, + "required": [ + "url", + "label", + "active" + ] + } + }, + "path": { + "type": [ + "string", + "null" + ], + "description": "Base path for paginator generated URLs." + }, + "per_page": { + "type": "integer", + "description": "Number of items shown per page.", + "minimum": 0 + }, + "to": { + "type": [ + "integer", + "null" + ], + "description": "Number of the last item in the slice.", + "minimum": 1 + }, + "total": { + "type": "integer", + "description": "Total number of items being paginated.", + "minimum": 0 + }, + "user_total_count": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "current_page", + "from", + "last_page", + "links", + "path", + "per_page", + "to", + "total", + "user_total_count" + ] + } + }, + "required": [ + "data", + "links", + "meta" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "members.store", + "summary": "Store a newly created resource in storage", + "tags": [ + "Members" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MemberRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`UserResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/UserResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/members/{member}": { + "get": { + "operationId": "members.show", + "summary": "Display the specified resource", + "tags": [ + "Members" + ], + "parameters": [ + { + "name": "member", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`UserResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/UserResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "members.update", + "summary": "Update the specified resource in storage", + "tags": [ + "Members" + ], + "parameters": [ + { + "name": "member", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MemberRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`UserResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/UserResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/modules/download": { + "post": { + "operationId": "moduleInstallation.download", + "tags": [ + "ModuleInstallation" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "path": { + "type": "string" + } + }, + "required": [ + "success", + "path" + ] + }, + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "error": { + "type": "string", + "const": "Checksum verification failed" + } + }, + "required": [ + "success", + "error" + ] + }, + { + "type": "boolean" + }, + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "error": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "Module download failed" + ] + } + ] + } + }, + "required": [ + "success", + "error" + ] + }, + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "error": { + "type": "string", + "const": "Download Exception" + } + }, + "required": [ + "success", + "error" + ] + }, + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "error": { + "type": "string", + "const": "Download Exception" + }, + "data": { + "type": "object", + "properties": { + "path": { + "type": "null" + } + }, + "required": [ + "path" + ] + } + }, + "required": [ + "success", + "error", + "data" + ] + } + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/modules/upload": { + "post": { + "operationId": "moduleInstallation.upload", + "tags": [ + "ModuleInstallation" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/UploadModuleRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/modules/unzip": { + "post": { + "operationId": "moduleInstallation.unzip", + "tags": [ + "ModuleInstallation" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnzipUpdateRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "path": { + "type": "string" + } + }, + "required": [ + "success", + "path" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/modules/copy": { + "post": { + "operationId": "moduleInstallation.copy", + "tags": [ + "ModuleInstallation" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/modules/complete": { + "post": { + "operationId": "moduleInstallation.complete", + "tags": [ + "ModuleInstallation" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/modules/{slug}/settings": { + "get": { + "operationId": "moduleSettings.show", + "tags": [ + "ModuleSettings" + ], + "parameters": [ + { + "name": "slug", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "schema": { + "type": "object", + "properties": { + "sections": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": {} + } + } + }, + "required": [ + "sections" + ] + }, + "values": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "required": [ + "schema", + "values" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "moduleSettings.update", + "tags": [ + "ModuleSettings" + ], + "parameters": [ + { + "name": "slug", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/modules": { + "get": { + "operationId": "modules.index", + "tags": [ + "Modules" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `ModuleResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModuleResource" + } + } + }, + "required": [ + "data" + ] + } + } + } + }, + "503": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string", + "const": "marketplace_unavailable" + } + }, + "required": [ + "error" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/modules/check": { + "get": { + "operationId": "modules.checkToken", + "tags": [ + "Modules" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "error": { + "type": "string", + "const": "invalid_token" + } + }, + "required": [ + "error" + ] + }, + { + "type": [ + "object", + "null" + ] + } + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/modules/{module}": { + "get": { + "operationId": "modules.show", + "tags": [ + "Modules" + ], + "parameters": [ + { + "name": "module", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`ModuleResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ModuleResource" + }, + "meta": { + "type": "object", + "properties": { + "modules": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModuleResource" + } + } + }, + "required": [ + "modules" + ] + } + }, + "required": [ + "data", + "meta" + ] + } + } + } + }, + "503": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string", + "const": "marketplace_unavailable" + } + }, + "required": [ + "error" + ] + } + } + } + }, + "404": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string", + "const": "not_found" + } + }, + "required": [ + "error" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/modules/{module}/enable": { + "post": { + "operationId": "modules.enable", + "tags": [ + "Modules" + ], + "parameters": [ + { + "name": "module", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/modules/{module}/disable": { + "post": { + "operationId": "modules.disable", + "tags": [ + "Modules" + ], + "parameters": [ + { + "name": "module", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/notes": { + "get": { + "operationId": "notes.index", + "summary": "Display a listing of the resource", + "tags": [ + "Notes" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Paginated set of `NoteResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NoteResource" + } + }, + "links": { + "type": "object", + "properties": { + "first": { + "type": [ + "string", + "null" + ] + }, + "last": { + "type": [ + "string", + "null" + ] + }, + "prev": { + "type": [ + "string", + "null" + ] + }, + "next": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "first", + "last", + "prev", + "next" + ] + }, + "meta": { + "type": "object", + "properties": { + "current_page": { + "type": "integer", + "minimum": 1 + }, + "from": { + "type": [ + "integer", + "null" + ], + "minimum": 1 + }, + "last_page": { + "type": "integer", + "minimum": 1 + }, + "links": { + "type": "array", + "description": "Generated paginator links.", + "items": { + "type": "object", + "properties": { + "url": { + "type": [ + "string", + "null" + ] + }, + "label": { + "type": "string" + }, + "active": { + "type": "boolean" + } + }, + "required": [ + "url", + "label", + "active" + ] + } + }, + "path": { + "type": [ + "string", + "null" + ], + "description": "Base path for paginator generated URLs." + }, + "per_page": { + "type": "integer", + "description": "Number of items shown per page.", + "minimum": 0 + }, + "to": { + "type": [ + "integer", + "null" + ], + "description": "Number of the last item in the slice.", + "minimum": 1 + }, + "total": { + "type": "integer", + "description": "Total number of items being paginated.", + "minimum": 0 + } + }, + "required": [ + "current_page", + "from", + "last_page", + "links", + "path", + "per_page", + "to", + "total" + ] + } + }, + "required": [ + "data", + "links", + "meta" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "notes.store", + "summary": "Store a newly created resource in storage", + "tags": [ + "Notes" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotesRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`NoteResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/NoteResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/notes/{note}": { + "get": { + "operationId": "notes.show", + "summary": "Display the specified resource", + "tags": [ + "Notes" + ], + "parameters": [ + { + "name": "note", + "in": "path", + "required": true, + "description": "The note ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`NoteResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/NoteResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "notes.update", + "summary": "Update the specified resource in storage", + "tags": [ + "Notes" + ], + "parameters": [ + { + "name": "note", + "in": "path", + "required": true, + "description": "The note ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`NoteResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/NoteResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + }, + "delete": { + "operationId": "notes.destroy", + "summary": "Remove the specified resource from storage", + "tags": [ + "Notes" + ], + "parameters": [ + { + "name": "note", + "in": "path", + "required": true, + "description": "The note ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/installation/wizard-step": { + "get": { + "operationId": "onboardingWizard.getStep", + "summary": "Handle the incoming request", + "tags": [ + "OnboardingWizard" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "profile_complete": { + "type": "null" + }, + "profile_language": { + "type": "null" + } + }, + "required": [ + "profile_complete", + "profile_language" + ] + }, + { + "type": "object", + "properties": { + "profile_complete": { + "type": "integer" + }, + "profile_language": { + "type": "string", + "const": "en" + } + }, + "required": [ + "profile_complete", + "profile_language" + ] + } + ] + } + } + } + } + } + }, + "post": { + "operationId": "onboardingWizard.updateStep", + "tags": [ + "OnboardingWizard" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "profile_complete": { + "type": "null" + } + }, + "required": [ + "profile_complete" + ] + } + } + } + } + } + } + }, + "/installation/wizard-language": { + "post": { + "operationId": "onboardingWizard.saveLanguage", + "tags": [ + "OnboardingWizard" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "profile_language": { + "type": "null" + } + }, + "required": [ + "profile_language" + ] + } + } + } + } + } + } + }, + "/pdf/drivers": { + "get": { + "operationId": "pDFConfiguration.getDrivers", + "summary": "Returns the available drivers", + "tags": [ + "PDFConfiguration" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "prefixItems": [ + { + "type": "string", + "const": "dompdf" + }, + { + "type": "string", + "const": "gotenberg" + } + ], + "minItems": 2, + "maxItems": 2, + "additionalItems": false + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/pdf/config": { + "get": { + "operationId": "pDFConfiguration.getEnvironment", + "summary": "Return the PDF settings", + "tags": [ + "PDFConfiguration" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "pdf_driver": { + "type": "string" + }, + "gotenberg_host": { + "type": "string" + }, + "gotenberg_margins": { + "type": "string" + }, + "gotenberg_papersize": { + "type": "string" + } + }, + "required": [ + "pdf_driver", + "gotenberg_host", + "gotenberg_margins", + "gotenberg_papersize" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "pDFConfiguration.saveEnvironment", + "summary": "Saves the settings", + "tags": [ + "PDFConfiguration" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PDFConfigurationRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "string", + "const": "pdf_variables_save_successfully" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/{company}/customer/payment-method": { + "get": { + "operationId": "payment.paymentMethod", + "summary": "Handle the incoming request", + "tags": [ + "PaymentMethod" + ], + "parameters": [ + { + "name": "company", + "in": "path", + "required": true, + "description": "The company slug", + "schema": { + "type": [ + "string", + "null" + ] + } + } + ], + "responses": { + "200": { + "description": "Array of `App.Http.Resources.Customer.PaymentMethodResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.PaymentMethodResource" + } + } + }, + "required": [ + "data" + ] + } + } + } + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/payment-methods": { + "get": { + "operationId": "payment-methods.index", + "summary": "Display a listing of the resource", + "tags": [ + "PaymentMethods" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `PaymentMethodResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PaymentMethodResource" + } + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "payment-methods.store", + "summary": "Store a newly created resource in storage", + "tags": [ + "PaymentMethods" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentMethodRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`PaymentMethodResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/PaymentMethodResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/payment-methods/{paymentMethod}": { + "get": { + "operationId": "payment-methods.show", + "summary": "Display the specified resource", + "tags": [ + "PaymentMethods" + ], + "parameters": [ + { + "name": "paymentMethod", + "in": "path", + "required": true, + "description": "The payment method ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`PaymentMethodResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/PaymentMethodResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "payment-methods.update", + "summary": "Update the specified resource in storage", + "tags": [ + "PaymentMethods" + ], + "parameters": [ + { + "name": "paymentMethod", + "in": "path", + "required": true, + "description": "The payment method ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentMethodRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`PaymentMethodResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/PaymentMethodResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + }, + "delete": { + "operationId": "payment-methods.destroy", + "summary": "Remove the specified resource from storage", + "tags": [ + "PaymentMethods" + ], + "parameters": [ + { + "name": "paymentMethod", + "in": "path", + "required": true, + "description": "The payment method ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/payments/{payment}/send/preview": { + "get": { + "operationId": "payments.sendPreview", + "tags": [ + "Payments" + ], + "parameters": [ + { + "name": "payment", + "in": "path", + "required": true, + "description": "The payment ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/payments/{payment}/send": { + "post": { + "operationId": "payments.send", + "tags": [ + "Payments" + ], + "parameters": [ + { + "name": "payment", + "in": "path", + "required": true, + "description": "The payment ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SendPaymentRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/payments/delete": { + "post": { + "operationId": "payments.delete", + "tags": [ + "Payments" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeletePaymentsRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/payments": { + "get": { + "operationId": "payments.index", + "summary": "Display a listing of the resource", + "tags": [ + "Payments" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `PaymentResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PaymentResource" + } + }, + "meta": { + "type": "object", + "properties": { + "payment_total_count": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "payment_total_count" + ] + } + }, + "required": [ + "data", + "meta" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "payments.store", + "summary": "Store a newly created resource in storage", + "tags": [ + "Payments" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`PaymentResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/PaymentResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/payments/{payment}": { + "get": { + "operationId": "payments.show", + "tags": [ + "Payments" + ], + "parameters": [ + { + "name": "payment", + "in": "path", + "required": true, + "description": "The payment ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`PaymentResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/PaymentResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "payments.update", + "tags": [ + "Payments" + ], + "parameters": [ + { + "name": "payment", + "in": "path", + "required": true, + "description": "The payment ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`PaymentResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/PaymentResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/{company}/customer/payments": { + "get": { + "operationId": "customerPortal.payment.payments.index", + "summary": "Display a listing of the resource", + "tags": [ + "Payments" + ], + "parameters": [ + { + "name": "company", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `App.Http.Resources.Customer.PaymentResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.PaymentResource" + } + }, + "meta": { + "type": "object", + "properties": { + "paymentTotalCount": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "paymentTotalCount" + ] + } + }, + "required": [ + "data", + "meta" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/{company}/customer/payments/{id}": { + "get": { + "operationId": "customerPortal.payment.payments.show", + "summary": "Display the specified resource", + "tags": [ + "Payments" + ], + "parameters": [ + { + "name": "company", + "in": "path", + "required": true, + "description": "The company slug", + "schema": { + "type": [ + "string", + "null" + ] + } + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/{company}/customer/profile": { + "post": { + "operationId": "profile.updateProfile", + "tags": [ + "Profile" + ], + "parameters": [ + { + "name": "company", + "in": "path", + "required": true, + "description": "The company slug", + "schema": { + "type": [ + "string", + "null" + ] + } + } + ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/CustomerProfileRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`App.Http.Resources.Customer.CustomerResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CustomerResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/{company}/customer/me": { + "get": { + "operationId": "profile.getUser", + "tags": [ + "Profile" + ], + "parameters": [ + { + "name": "company", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`App.Http.Resources.Customer.CustomerResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CustomerResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/recurring-invoices/delete": { + "post": { + "operationId": "recurringInvoice.delete", + "summary": "Remove the specified resource from storage", + "tags": [ + "RecurringInvoice" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/recurring-invoices": { + "get": { + "operationId": "recurring-invoices.index", + "summary": "Display a listing of the resource", + "tags": [ + "RecurringInvoice" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `RecurringInvoiceResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RecurringInvoiceResource" + } + }, + "meta": { + "type": "object", + "properties": { + "recurring_invoice_total_count": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "recurring_invoice_total_count" + ] + } + }, + "required": [ + "data", + "meta" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "recurring-invoices.store", + "summary": "Store a newly created resource in storage", + "tags": [ + "RecurringInvoice" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecurringInvoiceRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`RecurringInvoiceResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RecurringInvoiceResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/recurring-invoices/{recurringInvoice}": { + "get": { + "operationId": "recurring-invoices.show", + "summary": "Display the specified resource", + "tags": [ + "RecurringInvoice" + ], + "parameters": [ + { + "name": "recurringInvoice", + "in": "path", + "required": true, + "description": "The recurring invoice ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`RecurringInvoiceResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RecurringInvoiceResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "recurring-invoices.update", + "summary": "Update the specified resource in storage", + "tags": [ + "RecurringInvoice" + ], + "parameters": [ + { + "name": "recurringInvoice", + "in": "path", + "required": true, + "description": "The recurring invoice ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecurringInvoiceRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`RecurringInvoiceResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RecurringInvoiceResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/recurring-invoice-frequency": { + "get": { + "operationId": "recurringInvoice.recurringInvoiceFrequency", + "tags": [ + "RecurringInvoiceFrequency" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "next_invoice_at": { + "type": "string" + } + }, + "required": [ + "success", + "next_invoice_at" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/installation/requirements": { + "get": { + "operationId": "requirements.requirements", + "summary": "Display the requirements page", + "tags": [ + "Requirements" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "phpSupportInfo": { + "type": "string" + }, + "requirements": { + "type": "string" + } + }, + "required": [ + "phpSupportInfo", + "requirements" + ] + } + } + } + } + } + } + }, + "/auth/reset/password": { + "post": { + "operationId": "company.auth.resetPassword.reset", + "summary": "Reset the given user's password", + "tags": [ + "ResetPassword" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "token": { + "type": "string" + }, + "email": { + "type": "string", + "format": "email" + }, + "password": { + "type": "string" + }, + "password_confirmation": { + "type": "string" + } + }, + "required": [ + "token", + "email", + "password", + "password_confirmation" + ] + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "message": { + "type": "string", + "const": "Password reset successfully." + } + }, + "required": [ + "message" + ] + }, + { + "type": "object" + } + ] + } + } + } + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/{company}/customer/auth/reset/password": { + "post": { + "operationId": "customer.password.reset", + "summary": "Reset the given user's password", + "tags": [ + "ResetPassword" + ], + "parameters": [ + { + "name": "company", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "token": { + "type": "string" + }, + "email": { + "type": "string", + "format": "email" + }, + "password": { + "type": "string" + }, + "password_confirmation": { + "type": "string" + } + }, + "required": [ + "token", + "email", + "password", + "password_confirmation" + ] + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "message": { + "type": "string", + "const": "Password reset successfully." + } + }, + "required": [ + "message" + ] + }, + { + "type": "object" + } + ] + } + } + } + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/roles": { + "get": { + "operationId": "roles.index", + "summary": "Display a listing of the resource", + "tags": [ + "Roles" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `RoleResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RoleResource" + } + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "roles.store", + "summary": "Store a newly created resource in storage", + "tags": [ + "Roles" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RoleRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`RoleResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RoleResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/roles/{role}": { + "get": { + "operationId": "roles.show", + "summary": "Display the specified resource", + "tags": [ + "Roles" + ], + "parameters": [ + { + "name": "role", + "in": "path", + "required": true, + "description": "The role ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`RoleResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RoleResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "roles.update", + "summary": "Update the specified resource in storage", + "tags": [ + "Roles" + ], + "parameters": [ + { + "name": "role", + "in": "path", + "required": true, + "description": "The role ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`RoleResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/RoleResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + }, + "delete": { + "operationId": "roles.destroy", + "summary": "Remove the specified resource from storage", + "tags": [ + "Roles" + ], + "parameters": [ + { + "name": "role", + "in": "path", + "required": true, + "description": "The role ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/search": { + "get": { + "operationId": "general.search", + "summary": "Handle the incoming request", + "tags": [ + "Search" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "customers": { + "type": "object", + "properties": { + "current_page": { + "type": "integer", + "minimum": 1 + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Customer" + } + }, + "first_page_url": { + "type": [ + "string", + "null" + ] + }, + "from": { + "type": [ + "integer", + "null" + ], + "minimum": 1 + }, + "last_page_url": { + "type": [ + "string", + "null" + ] + }, + "last_page": { + "type": "integer", + "minimum": 1 + }, + "links": { + "type": "array", + "description": "Generated paginator links.", + "items": { + "type": "object", + "properties": { + "url": { + "type": [ + "string", + "null" + ] + }, + "label": { + "type": "string" + }, + "active": { + "type": "boolean" + } + }, + "required": [ + "url", + "label", + "active" + ] + } + }, + "next_page_url": { + "type": [ + "string", + "null" + ] + }, + "path": { + "type": [ + "string", + "null" + ], + "description": "Base path for paginator generated URLs." + }, + "per_page": { + "type": "integer", + "description": "Number of items shown per page.", + "minimum": 0 + }, + "prev_page_url": { + "type": [ + "string", + "null" + ] + }, + "to": { + "type": [ + "integer", + "null" + ], + "description": "Number of the last item in the slice.", + "minimum": 1 + }, + "total": { + "type": "integer", + "description": "Total number of items being paginated.", + "minimum": 0 + } + }, + "required": [ + "current_page", + "data", + "first_page_url", + "from", + "last_page_url", + "last_page", + "links", + "next_page_url", + "path", + "per_page", + "prev_page_url", + "to", + "total" + ] + }, + "users": { + "type": "object", + "properties": { + "current_page": { + "type": "integer", + "minimum": 1 + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + }, + "first_page_url": { + "type": [ + "string", + "null" + ] + }, + "from": { + "type": [ + "integer", + "null" + ], + "minimum": 1 + }, + "last_page_url": { + "type": [ + "string", + "null" + ] + }, + "last_page": { + "type": "integer", + "minimum": 1 + }, + "links": { + "type": "array", + "description": "Generated paginator links.", + "items": { + "type": "object", + "properties": { + "url": { + "type": [ + "string", + "null" + ] + }, + "label": { + "type": "string" + }, + "active": { + "type": "boolean" + } + }, + "required": [ + "url", + "label", + "active" + ] + } + }, + "next_page_url": { + "type": [ + "string", + "null" + ] + }, + "path": { + "type": [ + "string", + "null" + ], + "description": "Base path for paginator generated URLs." + }, + "per_page": { + "type": "integer", + "description": "Number of items shown per page.", + "minimum": 0 + }, + "prev_page_url": { + "type": [ + "string", + "null" + ] + }, + "to": { + "type": [ + "integer", + "null" + ], + "description": "Number of the last item in the slice.", + "minimum": 1 + }, + "total": { + "type": "integer", + "description": "Total number of items being paginated.", + "minimum": 0 + } + }, + "required": [ + "current_page", + "data", + "first_page_url", + "from", + "last_page_url", + "last_page", + "links", + "next_page_url", + "path", + "per_page", + "prev_page_url", + "to", + "total" + ] + } + }, + "required": [ + "customers", + "users" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/search/user": { + "get": { + "operationId": "search.users", + "tags": [ + "Search" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "users": { + "type": "object", + "properties": { + "current_page": { + "type": "integer", + "minimum": 1 + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + }, + "first_page_url": { + "type": [ + "string", + "null" + ] + }, + "from": { + "type": [ + "integer", + "null" + ], + "minimum": 1 + }, + "last_page_url": { + "type": [ + "string", + "null" + ] + }, + "last_page": { + "type": "integer", + "minimum": 1 + }, + "links": { + "type": "array", + "description": "Generated paginator links.", + "items": { + "type": "object", + "properties": { + "url": { + "type": [ + "string", + "null" + ] + }, + "label": { + "type": "string" + }, + "active": { + "type": "boolean" + } + }, + "required": [ + "url", + "label", + "active" + ] + } + }, + "next_page_url": { + "type": [ + "string", + "null" + ] + }, + "path": { + "type": [ + "string", + "null" + ], + "description": "Base path for paginator generated URLs." + }, + "per_page": { + "type": "integer", + "description": "Number of items shown per page.", + "minimum": 0 + }, + "prev_page_url": { + "type": [ + "string", + "null" + ] + }, + "to": { + "type": [ + "integer", + "null" + ], + "description": "Number of the last item in the slice.", + "minimum": 1 + }, + "total": { + "type": "integer", + "description": "Total number of items being paginated.", + "minimum": 0 + } + }, + "required": [ + "current_page", + "data", + "first_page_url", + "from", + "last_page_url", + "last_page", + "links", + "next_page_url", + "path", + "per_page", + "prev_page_url", + "to", + "total" + ] + } + }, + "required": [ + "users" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/next-number": { + "get": { + "operationId": "serialNumber.nextNumber", + "tags": [ + "SerialNumber" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "nextNumber": { + "type": "string" + } + }, + "required": [ + "success", + "nextNumber" + ] + }, + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "message": { + "type": "string" + } + }, + "required": [ + "success", + "message" + ] + }, + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/number-placeholders": { + "get": { + "operationId": "serialNumber.placeholders", + "tags": [ + "SerialNumber" + ], + "parameters": [ + { + "name": "format", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "placeholders": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + } + }, + "required": [ + "success", + "placeholders" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/settings": { + "get": { + "operationId": "settings.show", + "tags": [ + "Settings" + ], + "parameters": [ + { + "name": "key", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "prefixItems": [ + { + "type": "null" + } + ], + "minItems": 1, + "maxItems": 1, + "additionalItems": false + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + }, + "post": { + "operationId": "settings.update", + "tags": [ + "Settings" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SettingRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "": { + "type": "string" + } + }, + "required": [ + "success", + null + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/tax-types": { + "get": { + "operationId": "tax-types.index", + "summary": "Display a listing of the resource", + "tags": [ + "TaxTypes" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `TaxTypeResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TaxTypeResource" + } + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "tax-types.store", + "summary": "Store a newly created resource in storage", + "tags": [ + "TaxTypes" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaxTypeRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`TaxTypeResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/TaxTypeResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/tax-types/{taxType}": { + "get": { + "operationId": "tax-types.show", + "summary": "Display the specified resource", + "tags": [ + "TaxTypes" + ], + "parameters": [ + { + "name": "taxType", + "in": "path", + "required": true, + "description": "The tax type ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`TaxTypeResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/TaxTypeResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "tax-types.update", + "summary": "Update the specified resource in storage", + "tags": [ + "TaxTypes" + ], + "parameters": [ + { + "name": "taxType", + "in": "path", + "required": true, + "description": "The tax type ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`TaxTypeResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/TaxTypeResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + }, + "delete": { + "operationId": "tax-types.destroy", + "summary": "Remove the specified resource from storage", + "tags": [ + "TaxTypes" + ], + "parameters": [ + { + "name": "taxType", + "in": "path", + "required": true, + "description": "The tax type ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/units": { + "get": { + "operationId": "units.index", + "summary": "Display a listing of the resource", + "tags": [ + "Units" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Array of `UnitResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UnitResource" + } + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "post": { + "operationId": "units.store", + "summary": "Store a newly created resource in storage", + "tags": [ + "Units" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnitRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`UnitResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/UnitResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/units/{unit}": { + "get": { + "operationId": "units.show", + "summary": "Display the specified resource", + "tags": [ + "Units" + ], + "parameters": [ + { + "name": "unit", + "in": "path", + "required": true, + "description": "The unit ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`UnitResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/UnitResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "units.update", + "summary": "Update the specified resource in storage", + "tags": [ + "Units" + ], + "parameters": [ + { + "name": "unit", + "in": "path", + "required": true, + "description": "The unit ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnitRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`UnitResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/UnitResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + }, + "delete": { + "operationId": "units.destroy", + "summary": "Remove the specified resource from storage", + "tags": [ + "Units" + ], + "parameters": [ + { + "name": "unit", + "in": "path", + "required": true, + "description": "The unit ID", + "schema": { + "type": "integer" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/check/update": { + "get": { + "operationId": "update.checkVersion", + "tags": [ + "Update" + ], + "parameters": [ + { + "name": "channel", + "in": "query", + "schema": { + "type": "string", + "default": "stable" + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": [ + "object", + "null" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/update/download": { + "post": { + "operationId": "update.download", + "tags": [ + "Update" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "version": { + "type": "string" + } + }, + "required": [ + "version" + ] + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "boolean" + }, + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "error": { + "type": "string", + "const": "Download Exception" + }, + "data": { + "type": "object", + "properties": { + "path": { + "type": "null" + } + }, + "required": [ + "path" + ] + } + }, + "required": [ + "success", + "error", + "data" + ] + } + ] + } + }, + "required": [ + "success", + "path" + ] + } + } + } + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/update/unzip": { + "post": { + "operationId": "update.unzip", + "tags": [ + "Update" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ] + } + } + } + }, + "responses": { + "500": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "error": { + "type": "string" + } + }, + "required": [ + "success", + "error" + ] + } + } + } + }, + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "path": { + "type": "string" + } + }, + "required": [ + "success", + "path" + ] + } + } + } + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/update/copy": { + "post": { + "operationId": "update.copy", + "tags": [ + "Update" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ] + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "path": { + "type": "boolean" + } + }, + "required": [ + "success", + "path" + ] + } + } + } + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/update/delete": { + "post": { + "operationId": "update.delete", + "tags": [ + "Update" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "anyOf": [ + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "cleaned": { + "type": "integer" + } + }, + "required": [ + "success", + "cleaned" + ] + }, + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "error": { + "type": "string", + "const": "Invalid manifest" + } + }, + "required": [ + "success", + "error" + ] + } + ] + }, + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "cleaned": { + "type": "integer" + } + }, + "required": [ + "success", + "cleaned" + ] + } + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/update/clean": { + "post": { + "operationId": "update.clean", + "tags": [ + "Update" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "anyOf": [ + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "cleaned": { + "type": "integer" + } + }, + "required": [ + "success", + "cleaned" + ] + }, + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "error": { + "type": "string", + "const": "Invalid manifest" + } + }, + "required": [ + "success", + "error" + ] + } + ] + }, + { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "cleaned": { + "type": "integer" + } + }, + "required": [ + "success", + "cleaned" + ] + } + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/update/migrate": { + "post": { + "operationId": "update.migrate", + "tags": [ + "Update" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/update/finish": { + "post": { + "operationId": "update.finish", + "tags": [ + "Update" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "installed": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "installed", + "version" + ] + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "error": { + "type": "boolean" + }, + "data": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + } + }, + "required": [ + "success", + "error", + "data" + ] + } + } + } + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/me": { + "get": { + "operationId": "userProfile.show", + "tags": [ + "UserProfile" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "`UserResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/UserResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "userProfile.update", + "tags": [ + "UserProfile" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProfileRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`UserResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/UserResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/me/settings": { + "get": { + "operationId": "userProfile.showSettings", + "tags": [ + "UserProfile" + ], + "parameters": [ + { + "name": "settings[]", + "in": "query", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + }, + "put": { + "operationId": "userProfile.updateSettings", + "tags": [ + "UserProfile" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSettingsRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/me/upload-avatar": { + "post": { + "operationId": "userProfile.uploadAvatar", + "tags": [ + "UserProfile" + ], + "parameters": [ + { + "name": "company", + "in": "header", + "required": true, + "description": "ID of the company the request operates on (multi-tenancy).", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/AvatarRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`UserResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/UserResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + } + } + } + }, + "/super-admin/users": { + "get": { + "operationId": "users.index", + "tags": [ + "Users" + ], + "responses": { + "200": { + "description": "Paginated set of `UserResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UserResource" + } + }, + "links": { + "type": "object", + "properties": { + "first": { + "type": [ + "string", + "null" + ] + }, + "last": { + "type": [ + "string", + "null" + ] + }, + "prev": { + "type": [ + "string", + "null" + ] + }, + "next": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "first", + "last", + "prev", + "next" + ] + }, + "meta": { + "type": "object", + "properties": { + "current_page": { + "type": "integer", + "minimum": 1 + }, + "from": { + "type": [ + "integer", + "null" + ], + "minimum": 1 + }, + "last_page": { + "type": "integer", + "minimum": 1 + }, + "links": { + "type": "array", + "description": "Generated paginator links.", + "items": { + "type": "object", + "properties": { + "url": { + "type": [ + "string", + "null" + ] + }, + "label": { + "type": "string" + }, + "active": { + "type": "boolean" + } + }, + "required": [ + "url", + "label", + "active" + ] + } + }, + "path": { + "type": [ + "string", + "null" + ], + "description": "Base path for paginator generated URLs." + }, + "per_page": { + "type": "integer", + "description": "Number of items shown per page.", + "minimum": 0 + }, + "to": { + "type": [ + "integer", + "null" + ], + "description": "Number of the last item in the slice.", + "minimum": 1 + }, + "total": { + "type": "integer", + "description": "Total number of items being paginated.", + "minimum": 0 + } + }, + "required": [ + "current_page", + "from", + "last_page", + "links", + "path", + "per_page", + "to", + "total" + ] + } + }, + "required": [ + "data", + "links", + "meta" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/super-admin/users/{user}": { + "get": { + "operationId": "users.show", + "tags": [ + "Users" + ], + "parameters": [ + { + "name": "user", + "in": "path", + "required": true, + "description": "The user ID", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "`UserResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/UserResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + }, + "put": { + "operationId": "users.update", + "tags": [ + "Users" + ], + "parameters": [ + { + "name": "user", + "in": "path", + "required": true, + "description": "The user ID", + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdminUserUpdateRequest" + } + } + } + }, + "responses": { + "200": { + "description": "`UserResource`", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/UserResource" + } + }, + "required": [ + "data" + ] + } + } + } + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + }, + "422": { + "$ref": "#/components/responses/ValidationException" + }, + "403": { + "$ref": "#/components/responses/AuthorizationException" + } + } + } + }, + "/super-admin/users/{user}/impersonate": { + "post": { + "operationId": "users.impersonate", + "tags": [ + "Users" + ], + "parameters": [ + { + "name": "user", + "in": "path", + "required": true, + "description": "The user ID", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "token": { + "type": "string" + }, + "impersonation_log_id": { + "type": "integer" + }, + "user": { + "$ref": "#/components/schemas/UserResource" + } + }, + "required": [ + "token", + "impersonation_log_id", + "user" + ] + } + } + } + }, + "422": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string", + "const": "cannot_impersonate_self" + }, + "message": { + "type": "string", + "const": "You cannot impersonate yourself." + } + }, + "required": [ + "error", + "message" + ] + } + } + } + }, + "404": { + "$ref": "#/components/responses/ModelNotFoundException" + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + }, + "/super-admin/stop-impersonating": { + "post": { + "operationId": "users.stopImpersonating", + "tags": [ + "Users" + ], + "responses": { + "422": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string", + "const": "not_impersonating" + }, + "message": { + "type": "string", + "const": "No active impersonation session." + } + }, + "required": [ + "error", + "message" + ] + } + } + } + }, + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/AuthenticationException" + } + } + } + } + }, + "components": { + "securitySchemes": { + "http": { + "type": "http", + "scheme": "bearer" + } + }, + "schemas": { + "AddressResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "address_street_1": { + "type": [ + "string", + "null" + ] + }, + "address_street_2": { + "type": [ + "string", + "null" + ] + }, + "city": { + "type": [ + "string", + "null" + ] + }, + "state": { + "type": [ + "string", + "null" + ] + }, + "country_id": { + "type": [ + "integer", + "null" + ] + }, + "zip": { + "type": [ + "string", + "null" + ] + }, + "phone": { + "type": [ + "string", + "null" + ] + }, + "fax": { + "type": [ + "string", + "null" + ] + }, + "type": { + "type": [ + "string", + "null" + ] + }, + "user_id": { + "type": [ + "integer", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "customer_id": { + "type": [ + "integer", + "null" + ] + }, + "country": { + "$ref": "#/components/schemas/CountryResource" + }, + "user": { + "$ref": "#/components/schemas/UserResource" + } + }, + "required": [ + "id", + "name", + "address_street_1", + "address_street_2", + "city", + "state", + "country_id", + "zip", + "phone", + "fax", + "type", + "user_id", + "company_id", + "customer_id" + ], + "title": "AddressResource" + }, + "AdminCompanyUpdateRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "owner_id": { + "type": "integer" + }, + "vat_id": { + "type": [ + "string", + "null" + ] + }, + "tax_id": { + "type": [ + "string", + "null" + ] + }, + "address": { + "type": "object", + "properties": { + "name": { + "type": [ + "string", + "null" + ] + }, + "address_street_1": { + "type": [ + "string", + "null" + ] + }, + "address_street_2": { + "type": [ + "string", + "null" + ] + }, + "city": { + "type": [ + "string", + "null" + ] + }, + "state": { + "type": [ + "string", + "null" + ] + }, + "country_id": { + "type": [ + "integer", + "null" + ] + }, + "zip": { + "type": [ + "string", + "null" + ] + }, + "phone": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "required": [ + "name", + "owner_id" + ], + "title": "AdminCompanyUpdateRequest" + }, + "AdminUserUpdateRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "email": { + "type": "string" + }, + "phone": { + "type": [ + "string", + "null" + ] + }, + "password": { + "type": [ + "string", + "null" + ], + "minLength": 8 + } + }, + "required": [ + "name", + "email" + ], + "title": "AdminUserUpdateRequest" + }, + "AiConversation": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "company_id": { + "type": "integer" + }, + "user_id": { + "type": "integer" + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "model": { + "type": [ + "string", + "null" + ] + }, + "created_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "updated_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + } + }, + "required": [ + "id", + "company_id", + "user_id", + "title", + "model", + "created_at", + "updated_at" + ], + "title": "AiConversation" + }, + "AiMessage": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "conversation_id": { + "type": "integer" + }, + "role": { + "type": "string" + }, + "content": { + "type": [ + "string", + "null" + ] + }, + "tool_call_id": { + "type": [ + "string", + "null" + ] + }, + "tool_calls": { + "type": [ + "array", + "null" + ], + "items": {} + }, + "model": { + "type": [ + "string", + "null" + ] + }, + "tokens_in": { + "type": [ + "integer", + "null" + ] + }, + "tokens_out": { + "type": [ + "integer", + "null" + ] + }, + "created_at": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "id", + "conversation_id", + "role", + "content", + "tool_call_id", + "tool_calls", + "model", + "tokens_in", + "tokens_out", + "created_at" + ], + "title": "AiMessage" + }, + "App.Http.Resources.Customer.AddressResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "address_street_1": { + "type": [ + "string", + "null" + ] + }, + "address_street_2": { + "type": [ + "string", + "null" + ] + }, + "city": { + "type": [ + "string", + "null" + ] + }, + "state": { + "type": [ + "string", + "null" + ] + }, + "country_id": { + "type": [ + "integer", + "null" + ] + }, + "zip": { + "type": [ + "string", + "null" + ] + }, + "phone": { + "type": [ + "string", + "null" + ] + }, + "fax": { + "type": [ + "string", + "null" + ] + }, + "type": { + "type": [ + "string", + "null" + ] + }, + "user_id": { + "type": [ + "integer", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "customer_id": { + "type": [ + "integer", + "null" + ] + }, + "country": { + "$ref": "#/components/schemas/CountryResource" + }, + "user": { + "$ref": "#/components/schemas/UserResource" + } + }, + "required": [ + "id", + "name", + "address_street_1", + "address_street_2", + "city", + "state", + "country_id", + "zip", + "phone", + "fax", + "type", + "user_id", + "company_id", + "customer_id" + ], + "title": "App.Http.Resources.Customer.AddressResource" + }, + "App.Http.Resources.Customer.CompanyResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "slug": { + "type": [ + "string", + "null" + ] + }, + "logo": { + "type": [ + "string", + "null" + ] + }, + "logo_path": { + "type": "string" + }, + "unique_hash": { + "type": [ + "string", + "null" + ] + }, + "owner_id": { + "type": [ + "integer", + "null" + ] + }, + "address": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.AddressResource" + } + }, + "required": [ + "id", + "name", + "slug", + "logo", + "logo_path", + "unique_hash", + "owner_id" + ], + "title": "App.Http.Resources.Customer.CompanyResource" + }, + "App.Http.Resources.Customer.CurrencyResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "code": { + "type": "string" + }, + "symbol": { + "type": [ + "string", + "null" + ] + }, + "precision": { + "type": "integer" + }, + "thousand_separator": { + "type": "string" + }, + "decimal_separator": { + "type": "string" + }, + "swap_currency_symbol": { + "type": "integer" + }, + "exchange_rate": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "code", + "symbol", + "precision", + "thousand_separator", + "decimal_separator", + "swap_currency_symbol", + "exchange_rate" + ], + "title": "App.Http.Resources.Customer.CurrencyResource" + }, + "App.Http.Resources.Customer.CustomFieldResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "label": { + "type": "string" + }, + "model_type": { + "type": "string" + }, + "type": { + "type": "string" + }, + "placeholder": { + "type": [ + "string", + "null" + ] + }, + "options": { + "type": [ + "string", + "null" + ] + }, + "boolean_answer": { + "type": [ + "integer", + "null" + ] + }, + "date_answer": { + "type": [ + "string", + "null" + ] + }, + "time_answer": { + "type": [ + "string", + "null" + ] + }, + "string_answer": { + "type": [ + "string", + "null" + ] + }, + "number_answer": { + "type": [ + "integer", + "null" + ] + }, + "date_time_answer": { + "type": [ + "string", + "null" + ] + }, + "is_required": { + "type": "integer" + }, + "in_use": { + "type": "string" + }, + "order": { + "type": "integer" + }, + "company_id": { + "type": "integer" + }, + "default_answer": { + "type": "string" + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "required": [ + "id", + "name", + "slug", + "label", + "model_type", + "type", + "placeholder", + "options", + "boolean_answer", + "date_answer", + "time_answer", + "string_answer", + "number_answer", + "date_time_answer", + "is_required", + "in_use", + "order", + "company_id", + "default_answer" + ], + "title": "App.Http.Resources.Customer.CustomFieldResource" + }, + "App.Http.Resources.Customer.CustomFieldValueResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "custom_field_valuable_type": { + "type": "string" + }, + "custom_field_valuable_id": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "boolean_answer": { + "type": [ + "integer", + "null" + ] + }, + "date_answer": { + "type": [ + "string", + "null" + ] + }, + "time_answer": { + "type": [ + "string", + "null" + ] + }, + "string_answer": { + "type": [ + "string", + "null" + ] + }, + "number_answer": { + "type": [ + "integer", + "null" + ] + }, + "date_time_answer": { + "type": [ + "string", + "null" + ] + }, + "custom_field_id": { + "type": "integer" + }, + "company_id": { + "type": "integer" + }, + "default_answer": { + "type": "string" + }, + "custom_field": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CustomFieldResource" + }, + "company": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CompanyResource" + } + }, + "required": [ + "id", + "custom_field_valuable_type", + "custom_field_valuable_id", + "type", + "boolean_answer", + "date_answer", + "time_answer", + "string_answer", + "number_answer", + "date_time_answer", + "custom_field_id", + "company_id", + "default_answer" + ], + "title": "App.Http.Resources.Customer.CustomFieldValueResource" + }, + "App.Http.Resources.Customer.CustomerResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "email": { + "type": [ + "string", + "null" + ] + }, + "phone": { + "type": [ + "string", + "null" + ] + }, + "contact_name": { + "type": [ + "string", + "null" + ] + }, + "company_name": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "enable_portal": { + "type": "boolean" + }, + "currency_id": { + "type": [ + "integer", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "facebook_id": { + "type": [ + "string", + "null" + ] + }, + "google_id": { + "type": [ + "string", + "null" + ] + }, + "github_id": { + "type": [ + "string", + "null" + ] + }, + "formatted_created_at": { + "type": "string" + }, + "avatar": { + "type": "string" + }, + "prefix": { + "type": [ + "string", + "null" + ] + }, + "tax_id": { + "type": [ + "string", + "null" + ] + }, + "billing": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.AddressResource" + }, + "shipping": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.AddressResource" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CustomFieldValueResource" + } + }, + "company": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CompanyResource" + }, + "currency": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CurrencyResource" + } + }, + "required": [ + "id", + "name", + "email", + "phone", + "contact_name", + "company_name", + "website", + "enable_portal", + "currency_id", + "company_id", + "facebook_id", + "google_id", + "github_id", + "formatted_created_at", + "avatar", + "prefix", + "tax_id" + ], + "title": "App.Http.Resources.Customer.CustomerResource" + }, + "App.Http.Resources.Customer.EstimateItemResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "discount_type": { + "type": "string" + }, + "quantity": { + "type": "number" + }, + "unit_name": { + "type": [ + "string", + "null" + ] + }, + "discount": { + "type": [ + "number", + "null" + ] + }, + "discount_val": { + "type": [ + "integer", + "null" + ] + }, + "price": { + "type": "integer" + }, + "tax": { + "type": "integer" + }, + "total": { + "type": "integer" + }, + "item_id": { + "type": [ + "integer", + "null" + ] + }, + "estimate_id": { + "type": "integer" + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "exchange_rate": { + "type": [ + "string", + "null" + ] + }, + "base_discount_val": { + "type": [ + "integer", + "null" + ] + }, + "base_price": { + "type": [ + "integer", + "null" + ] + }, + "base_tax": { + "type": [ + "integer", + "null" + ] + }, + "base_total": { + "type": [ + "integer", + "null" + ] + }, + "taxes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TaxResource" + } + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomFieldValueResource" + } + } + }, + "required": [ + "id", + "name", + "description", + "discount_type", + "quantity", + "unit_name", + "discount", + "discount_val", + "price", + "tax", + "total", + "item_id", + "estimate_id", + "company_id", + "exchange_rate", + "base_discount_val", + "base_price", + "base_tax", + "base_total" + ], + "title": "App.Http.Resources.Customer.EstimateItemResource" + }, + "App.Http.Resources.Customer.EstimateResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "estimate_date": { + "type": "string" + }, + "expiry_date": { + "type": [ + "string", + "null" + ] + }, + "estimate_number": { + "type": "string" + }, + "status": { + "type": "string" + }, + "reference_number": { + "type": [ + "string", + "null" + ] + }, + "tax_per_item": { + "type": "string" + }, + "discount_per_item": { + "type": "string" + }, + "notes": { + "type": [ + "string", + "null" + ] + }, + "discount": { + "type": [ + "number", + "null" + ] + }, + "discount_type": { + "type": [ + "string", + "null" + ] + }, + "discount_val": { + "type": [ + "integer", + "null" + ] + }, + "sub_total": { + "type": "integer" + }, + "total": { + "type": "integer" + }, + "tax": { + "type": "integer" + }, + "unique_hash": { + "type": [ + "string", + "null" + ] + }, + "template_name": { + "type": [ + "string", + "null" + ] + }, + "customer_id": { + "type": [ + "integer", + "null" + ] + }, + "exchange_rate": { + "type": [ + "number", + "null" + ] + }, + "base_discount_val": { + "type": [ + "integer", + "null" + ] + }, + "base_sub_total": { + "type": [ + "integer", + "null" + ] + }, + "base_total": { + "type": [ + "integer", + "null" + ] + }, + "base_tax": { + "type": [ + "integer", + "null" + ] + }, + "currency_id": { + "type": [ + "integer", + "null" + ] + }, + "formatted_expiry_date": { + "type": "string" + }, + "formatted_estimate_date": { + "type": "string" + }, + "estimate_pdf_url": { + "type": "string" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.EstimateItemResource" + } + }, + "customer": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CustomerResource" + }, + "taxes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.TaxResource" + } + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CustomFieldValueResource" + } + }, + "company": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CompanyResource" + }, + "currency": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CurrencyResource" + } + }, + "required": [ + "id", + "estimate_date", + "expiry_date", + "estimate_number", + "status", + "reference_number", + "tax_per_item", + "discount_per_item", + "notes", + "discount", + "discount_type", + "discount_val", + "sub_total", + "total", + "tax", + "unique_hash", + "template_name", + "customer_id", + "exchange_rate", + "base_discount_val", + "base_sub_total", + "base_total", + "base_tax", + "currency_id", + "formatted_expiry_date", + "formatted_estimate_date", + "estimate_pdf_url" + ], + "title": "App.Http.Resources.Customer.EstimateResource" + }, + "App.Http.Resources.Customer.ExpenseCategoryResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "amount": { + "type": "string" + }, + "formatted_created_at": { + "type": "string" + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "required": [ + "id", + "name", + "description", + "company_id", + "amount", + "formatted_created_at" + ], + "title": "App.Http.Resources.Customer.ExpenseCategoryResource" + }, + "App.Http.Resources.Customer.ExpenseResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "expense_date": { + "type": "string" + }, + "expense_number": { + "type": [ + "string", + "null" + ] + }, + "amount": { + "type": "integer" + }, + "notes": { + "type": [ + "string", + "null" + ] + }, + "customer_id": { + "type": [ + "integer", + "null" + ] + }, + "attachment_receipt_url": { + "type": "string" + }, + "attachment_receipt": { + "type": "string" + }, + "attachment_receipt_meta": { + "type": "string" + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "expense_category_id": { + "type": "integer" + }, + "formatted_expense_date": { + "type": "string" + }, + "formatted_created_at": { + "type": "string" + }, + "exchange_rate": { + "type": [ + "number", + "null" + ] + }, + "currency_id": { + "type": [ + "integer", + "null" + ] + }, + "base_amount": { + "type": [ + "integer", + "null" + ] + }, + "payment_method_id": { + "type": [ + "integer", + "null" + ] + }, + "customer": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CustomerResource" + }, + "expense_category": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.ExpenseCategoryResource" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CustomFieldValueResource" + } + }, + "company": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CompanyResource" + }, + "currency": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CurrencyResource" + }, + "payment_method": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.PaymentMethodResource" + } + }, + "required": [ + "id", + "expense_date", + "expense_number", + "amount", + "notes", + "customer_id", + "attachment_receipt_url", + "attachment_receipt", + "attachment_receipt_meta", + "company_id", + "expense_category_id", + "formatted_expense_date", + "formatted_created_at", + "exchange_rate", + "currency_id", + "base_amount", + "payment_method_id" + ], + "title": "App.Http.Resources.Customer.ExpenseResource" + }, + "App.Http.Resources.Customer.InvoiceItemResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "discount_type": { + "type": "string" + }, + "price": { + "type": "integer" + }, + "quantity": { + "type": "number" + }, + "unit_name": { + "type": [ + "string", + "null" + ] + }, + "discount": { + "type": [ + "number", + "null" + ] + }, + "discount_val": { + "type": "integer" + }, + "tax": { + "type": "integer" + }, + "total": { + "type": "integer" + }, + "invoice_id": { + "type": [ + "integer", + "null" + ] + }, + "item_id": { + "type": [ + "integer", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "base_price": { + "type": [ + "integer", + "null" + ] + }, + "exchange_rate": { + "type": [ + "string", + "null" + ] + }, + "base_discount_val": { + "type": [ + "integer", + "null" + ] + }, + "base_tax": { + "type": [ + "integer", + "null" + ] + }, + "base_total": { + "type": [ + "integer", + "null" + ] + }, + "recurring_invoice_id": { + "type": [ + "integer", + "null" + ] + }, + "taxes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TaxResource" + } + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomFieldValueResource" + } + } + }, + "required": [ + "id", + "name", + "description", + "discount_type", + "price", + "quantity", + "unit_name", + "discount", + "discount_val", + "tax", + "total", + "invoice_id", + "item_id", + "company_id", + "base_price", + "exchange_rate", + "base_discount_val", + "base_tax", + "base_total", + "recurring_invoice_id" + ], + "title": "App.Http.Resources.Customer.InvoiceItemResource" + }, + "App.Http.Resources.Customer.InvoiceResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "invoice_date": { + "type": "string" + }, + "due_date": { + "type": [ + "string", + "null" + ] + }, + "invoice_number": { + "type": "string" + }, + "reference_number": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string" + }, + "paid_status": { + "type": "string" + }, + "tax_per_item": { + "type": "string" + }, + "discount_per_item": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "discount_type": { + "type": [ + "string", + "null" + ] + }, + "discount": { + "type": [ + "number", + "null" + ] + }, + "discount_val": { + "type": [ + "integer", + "null" + ] + }, + "sub_total": { + "type": "integer" + }, + "total": { + "type": "integer" + }, + "tax": { + "type": "integer" + }, + "due_amount": { + "type": "integer" + }, + "sent": { + "type": "integer" + }, + "viewed": { + "type": "integer" + }, + "unique_hash": { + "type": [ + "string", + "null" + ] + }, + "template_name": { + "type": [ + "string", + "null" + ] + }, + "customer_id": { + "type": [ + "integer", + "null" + ] + }, + "recurring_invoice_id": { + "type": [ + "integer", + "null" + ] + }, + "sequence_number": { + "type": [ + "integer", + "null" + ] + }, + "base_discount_val": { + "type": [ + "integer", + "null" + ] + }, + "base_sub_total": { + "type": [ + "integer", + "null" + ] + }, + "base_total": { + "type": [ + "integer", + "null" + ] + }, + "base_tax": { + "type": [ + "integer", + "null" + ] + }, + "base_due_amount": { + "type": [ + "integer", + "null" + ] + }, + "currency_id": { + "type": [ + "integer", + "null" + ] + }, + "formatted_created_at": { + "type": "string" + }, + "formatted_notes": { + "type": "string" + }, + "invoice_pdf_url": { + "type": "string" + }, + "formatted_invoice_date": { + "type": "string" + }, + "formatted_due_date": { + "type": "string" + }, + "payment_module_enabled": { + "type": "string" + }, + "overdue": { + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.InvoiceItemResource" + } + }, + "customer": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CustomerResource" + }, + "taxes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.TaxResource" + } + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CustomFieldValueResource" + } + }, + "company": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CompanyResource" + }, + "currency": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CurrencyResource" + } + }, + "required": [ + "id", + "invoice_date", + "due_date", + "invoice_number", + "reference_number", + "status", + "paid_status", + "tax_per_item", + "discount_per_item", + "notes", + "discount_type", + "discount", + "discount_val", + "sub_total", + "total", + "tax", + "due_amount", + "sent", + "viewed", + "unique_hash", + "template_name", + "customer_id", + "recurring_invoice_id", + "sequence_number", + "base_discount_val", + "base_sub_total", + "base_total", + "base_tax", + "base_due_amount", + "currency_id", + "formatted_created_at", + "formatted_notes", + "invoice_pdf_url", + "formatted_invoice_date", + "formatted_due_date", + "payment_module_enabled", + "overdue" + ], + "title": "App.Http.Resources.Customer.InvoiceResource" + }, + "App.Http.Resources.Customer.PaymentMethodResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "company": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CompanyResource" + } + }, + "required": [ + "id", + "name", + "company_id" + ], + "title": "App.Http.Resources.Customer.PaymentMethodResource" + }, + "App.Http.Resources.Customer.PaymentResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "payment_number": { + "type": "string" + }, + "payment_date": { + "type": "string" + }, + "notes": { + "type": [ + "string", + "null" + ] + }, + "amount": { + "type": "integer" + }, + "unique_hash": { + "type": [ + "string", + "null" + ] + }, + "invoice_id": { + "type": [ + "integer", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "payment_method_id": { + "type": [ + "integer", + "null" + ] + }, + "customer_id": { + "type": [ + "integer", + "null" + ] + }, + "exchange_rate": { + "type": [ + "number", + "null" + ] + }, + "base_amount": { + "type": [ + "integer", + "null" + ] + }, + "currency_id": { + "type": [ + "integer", + "null" + ] + }, + "transaction_id": { + "type": [ + "integer", + "null" + ] + }, + "formatted_created_at": { + "type": "string" + }, + "formatted_payment_date": { + "type": "string" + }, + "payment_pdf_url": { + "type": "string" + }, + "customer": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CustomerResource" + }, + "invoice": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.InvoiceResource" + }, + "payment_method": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.PaymentMethodResource" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CustomFieldValueResource" + } + }, + "company": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CompanyResource" + }, + "currency": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CurrencyResource" + }, + "transaction": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.TransactionResource" + } + }, + "required": [ + "id", + "payment_number", + "payment_date", + "notes", + "amount", + "unique_hash", + "invoice_id", + "company_id", + "payment_method_id", + "customer_id", + "exchange_rate", + "base_amount", + "currency_id", + "transaction_id", + "formatted_created_at", + "formatted_payment_date", + "payment_pdf_url" + ], + "title": "App.Http.Resources.Customer.PaymentResource" + }, + "App.Http.Resources.Customer.TaxResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "tax_type_id": { + "type": "integer" + }, + "invoice_id": { + "type": [ + "integer", + "null" + ] + }, + "estimate_id": { + "type": [ + "integer", + "null" + ] + }, + "invoice_item_id": { + "type": [ + "integer", + "null" + ] + }, + "estimate_item_id": { + "type": [ + "integer", + "null" + ] + }, + "item_id": { + "type": [ + "integer", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "name": { + "type": "string" + }, + "amount": { + "type": "integer" + }, + "percent": { + "type": [ + "number", + "null" + ] + }, + "compound_tax": { + "type": "integer" + }, + "base_amount": { + "type": [ + "integer", + "null" + ] + }, + "currency_id": { + "type": [ + "integer", + "null" + ] + }, + "recurring_invoice_id": { + "type": [ + "integer", + "null" + ] + }, + "tax_type": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.TaxTypeResource" + }, + "currency": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CurrencyResource" + } + }, + "required": [ + "id", + "tax_type_id", + "invoice_id", + "estimate_id", + "invoice_item_id", + "estimate_item_id", + "item_id", + "company_id", + "name", + "amount", + "percent", + "compound_tax", + "base_amount", + "currency_id", + "recurring_invoice_id" + ], + "title": "App.Http.Resources.Customer.TaxResource" + }, + "App.Http.Resources.Customer.TaxTypeResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "percent": { + "type": [ + "number", + "null" + ] + }, + "compound_tax": { + "type": "boolean" + }, + "collective_tax": { + "type": "integer" + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "company": { + "$ref": "#/components/schemas/App.Http.Resources.Customer.CompanyResource" + } + }, + "required": [ + "id", + "name", + "percent", + "compound_tax", + "collective_tax", + "description", + "company_id" + ], + "title": "App.Http.Resources.Customer.TaxTypeResource" + }, + "App.Http.Resources.Customer.TransactionResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "transaction_id": { + "type": [ + "string", + "null" + ] + }, + "type": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string" + }, + "transaction_date": { + "type": "string" + }, + "invoice_id": { + "type": "integer" + }, + "invoice": { + "$ref": "#/components/schemas/InvoiceResource" + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "required": [ + "id", + "transaction_id", + "type", + "status", + "transaction_date", + "invoice_id" + ], + "title": "App.Http.Resources.Customer.TransactionResource" + }, + "AvatarRequest": { + "type": "object", + "properties": { + "admin_avatar": { + "type": [ + "string", + "null" + ], + "format": "binary", + "contentMediaType": "application/octet-stream", + "maxLength": 20000 + }, + "avatar": { + "type": [ + "string", + "null" + ] + } + }, + "title": "AvatarRequest" + }, + "BulkExchangeRateRequest": { + "type": "object", + "properties": { + "currencies": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "number" + }, + "exchange_rate": { + "type": "string" + } + }, + "required": [ + "id", + "exchange_rate" + ] + } + } + }, + "required": [ + "currencies" + ], + "title": "BulkExchangeRateRequest" + }, + "CompaniesRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "currency": { + "type": "string" + }, + "address": { + "type": "object", + "properties": { + "name": { + "type": [ + "string", + "null" + ] + }, + "address_street_1": { + "type": [ + "string", + "null" + ] + }, + "address_street_2": { + "type": [ + "string", + "null" + ] + }, + "city": { + "type": [ + "string", + "null" + ] + }, + "state": { + "type": [ + "string", + "null" + ] + }, + "country_id": { + "type": "string" + }, + "zip": { + "type": [ + "string", + "null" + ] + }, + "phone": { + "type": [ + "string", + "null" + ] + }, + "fax": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "country_id" + ] + } + }, + "required": [ + "name", + "currency", + "address" + ], + "title": "CompaniesRequest" + }, + "Company": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "logo": { + "type": [ + "string", + "null" + ] + }, + "unique_hash": { + "type": [ + "string", + "null" + ] + }, + "created_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "updated_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "slug": { + "type": [ + "string", + "null" + ] + }, + "owner_id": { + "type": [ + "integer", + "null" + ] + }, + "vat_id": { + "type": [ + "string", + "null" + ] + }, + "tax_id": { + "type": [ + "string", + "null" + ] + }, + "logo_path": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "logo", + "unique_hash", + "created_at", + "updated_at", + "slug", + "owner_id", + "vat_id", + "tax_id", + "logo_path" + ], + "title": "Company" + }, + "CompanyInvitationResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "company_id": { + "type": "integer" + }, + "email": { + "type": "string" + }, + "token": { + "type": "string" + }, + "status": { + "type": "string" + }, + "expires_at": { + "type": "string" + }, + "created_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + }, + "role": { + "$ref": "#/components/schemas/RoleResource" + }, + "invited_by": { + "$ref": "#/components/schemas/UserResource" + } + }, + "required": [ + "id", + "company_id", + "email", + "token", + "status", + "expires_at", + "created_at" + ], + "title": "CompanyInvitationResource" + }, + "CompanyLogoRequest": { + "type": "object", + "properties": { + "company_logo": { + "type": [ + "string", + "null" + ] + } + }, + "title": "CompanyLogoRequest" + }, + "CompanyMailConfigurationRequest": { + "type": "object", + "properties": { + "use_custom_mail_config": { + "type": "string", + "enum": [ + "YES", + "NO" + ] + }, + "mail_driver": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "use_custom_mail_config" + ], + "title": "CompanyMailConfigurationRequest" + }, + "CompanyRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "vat_id": { + "type": [ + "string", + "null" + ] + }, + "tax_id": { + "type": [ + "string", + "null" + ] + }, + "address": { + "type": "object", + "properties": { + "country_id": { + "type": "string" + } + }, + "required": [ + "country_id" + ] + } + }, + "required": [ + "name", + "address" + ], + "title": "CompanyRequest" + }, + "CompanyResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "vat_id": { + "type": [ + "string", + "null" + ] + }, + "tax_id": { + "type": [ + "string", + "null" + ] + }, + "logo": { + "type": [ + "string", + "null" + ] + }, + "logo_path": { + "type": "string" + }, + "unique_hash": { + "type": [ + "string", + "null" + ] + }, + "owner_id": { + "type": [ + "integer", + "null" + ] + }, + "slug": { + "type": [ + "string", + "null" + ] + }, + "created_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "updated_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "address": { + "$ref": "#/components/schemas/AddressResource" + }, + "owner": { + "$ref": "#/components/schemas/UserResource" + }, + "roles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RoleResource" + } + }, + "user_role": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id", + "name", + "vat_id", + "tax_id", + "logo", + "logo_path", + "unique_hash", + "owner_id", + "slug", + "created_at", + "updated_at", + "roles", + "user_role" + ], + "title": "CompanyResource" + }, + "CountryResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "code": { + "type": "string" + }, + "name": { + "type": "string" + }, + "phone_code": { + "type": "string" + } + }, + "required": [ + "id", + "code", + "name", + "phone_code" + ], + "title": "CountryResource" + }, + "Currency": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "code": { + "type": "string" + }, + "symbol": { + "type": [ + "string", + "null" + ] + }, + "precision": { + "type": "integer" + }, + "thousand_separator": { + "type": "string" + }, + "decimal_separator": { + "type": "string" + }, + "swap_currency_symbol": { + "type": "integer" + }, + "created_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "updated_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + } + }, + "required": [ + "id", + "name", + "code", + "symbol", + "precision", + "thousand_separator", + "decimal_separator", + "swap_currency_symbol", + "created_at", + "updated_at" + ], + "title": "Currency" + }, + "CurrencyResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "code": { + "type": "string" + }, + "symbol": { + "type": [ + "string", + "null" + ] + }, + "precision": { + "type": "integer" + }, + "thousand_separator": { + "type": "string" + }, + "decimal_separator": { + "type": "string" + }, + "swap_currency_symbol": { + "type": "integer" + }, + "exchange_rate": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "code", + "symbol", + "precision", + "thousand_separator", + "decimal_separator", + "swap_currency_symbol", + "exchange_rate" + ], + "title": "CurrencyResource" + }, + "CustomFieldRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "label": { + "type": "string" + }, + "model_type": { + "type": "string" + }, + "order": { + "type": "string" + }, + "type": { + "type": "string" + }, + "is_required": { + "type": "boolean" + }, + "options": { + "type": "array", + "items": { + "type": "string" + } + }, + "placeholder": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "name", + "label", + "model_type", + "order", + "type", + "is_required" + ], + "title": "CustomFieldRequest" + }, + "CustomFieldResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "label": { + "type": "string" + }, + "model_type": { + "type": "string" + }, + "type": { + "type": "string" + }, + "placeholder": { + "type": [ + "string", + "null" + ] + }, + "options": { + "type": [ + "string", + "null" + ] + }, + "boolean_answer": { + "type": [ + "integer", + "null" + ] + }, + "date_answer": { + "type": [ + "string", + "null" + ] + }, + "time_answer": { + "type": [ + "string", + "null" + ] + }, + "string_answer": { + "type": [ + "string", + "null" + ] + }, + "number_answer": { + "type": [ + "integer", + "null" + ] + }, + "date_time_answer": { + "type": [ + "string", + "null" + ] + }, + "is_required": { + "type": "integer" + }, + "in_use": { + "type": "string" + }, + "order": { + "type": "integer" + }, + "company_id": { + "type": "integer" + }, + "default_answer": { + "type": "string" + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "required": [ + "id", + "name", + "slug", + "label", + "model_type", + "type", + "placeholder", + "options", + "boolean_answer", + "date_answer", + "time_answer", + "string_answer", + "number_answer", + "date_time_answer", + "is_required", + "in_use", + "order", + "company_id", + "default_answer" + ], + "title": "CustomFieldResource" + }, + "CustomFieldValueResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "custom_field_valuable_type": { + "type": "string" + }, + "custom_field_valuable_id": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "boolean_answer": { + "type": [ + "integer", + "null" + ] + }, + "date_answer": { + "type": [ + "string", + "null" + ] + }, + "time_answer": { + "type": [ + "string", + "null" + ] + }, + "string_answer": { + "type": [ + "string", + "null" + ] + }, + "number_answer": { + "type": [ + "integer", + "null" + ] + }, + "date_time_answer": { + "type": [ + "string", + "null" + ] + }, + "custom_field_id": { + "type": "integer" + }, + "company_id": { + "type": "integer" + }, + "default_answer": { + "type": "string" + }, + "default_formatted_answer": { + "type": [ + "string", + "null" + ] + }, + "custom_field": { + "$ref": "#/components/schemas/CustomFieldResource" + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "required": [ + "id", + "custom_field_valuable_type", + "custom_field_valuable_id", + "type", + "boolean_answer", + "date_answer", + "time_answer", + "string_answer", + "number_answer", + "date_time_answer", + "custom_field_id", + "company_id", + "default_answer", + "default_formatted_answer" + ], + "title": "CustomFieldValueResource" + }, + "Customer": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "email": { + "type": [ + "string", + "null" + ] + }, + "phone": { + "type": [ + "string", + "null" + ] + }, + "facebook_id": { + "type": [ + "string", + "null" + ] + }, + "google_id": { + "type": [ + "string", + "null" + ] + }, + "github_id": { + "type": [ + "string", + "null" + ] + }, + "contact_name": { + "type": [ + "string", + "null" + ] + }, + "company_name": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "enable_portal": { + "type": "boolean" + }, + "currency_id": { + "type": [ + "integer", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "creator_id": { + "type": [ + "integer", + "null" + ] + }, + "created_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "updated_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "prefix": { + "type": [ + "string", + "null" + ] + }, + "tax_id": { + "type": [ + "string", + "null" + ] + }, + "avatar": { + "type": "string" + }, + "currency": { + "$ref": "#/components/schemas/Currency" + } + }, + "required": [ + "id", + "name", + "email", + "phone", + "facebook_id", + "google_id", + "github_id", + "contact_name", + "company_name", + "website", + "enable_portal", + "currency_id", + "company_id", + "creator_id", + "created_at", + "updated_at", + "prefix", + "tax_id", + "avatar" + ], + "title": "Customer" + }, + "CustomerProfileRequest": { + "type": "object", + "properties": { + "name": { + "type": [ + "string", + "null" + ] + }, + "password": { + "type": [ + "string", + "null" + ], + "minLength": 8 + }, + "email": { + "type": [ + "string", + "null" + ] + }, + "customer_avatar": { + "type": [ + "string", + "null" + ], + "format": "binary", + "contentMediaType": "application/octet-stream", + "maxLength": 20000 + }, + "billing": { + "type": "object", + "properties": { + "name": { + "type": [ + "string", + "null" + ] + }, + "address_street_1": { + "type": [ + "string", + "null" + ] + }, + "address_street_2": { + "type": [ + "string", + "null" + ] + }, + "city": { + "type": [ + "string", + "null" + ] + }, + "state": { + "type": [ + "string", + "null" + ] + }, + "country_id": { + "type": [ + "string", + "null" + ] + }, + "zip": { + "type": [ + "string", + "null" + ] + }, + "phone": { + "type": [ + "string", + "null" + ] + }, + "fax": { + "type": [ + "string", + "null" + ] + } + } + }, + "shipping": { + "type": "object", + "properties": { + "name": { + "type": [ + "string", + "null" + ] + }, + "address_street_1": { + "type": [ + "string", + "null" + ] + }, + "address_street_2": { + "type": [ + "string", + "null" + ] + }, + "city": { + "type": [ + "string", + "null" + ] + }, + "state": { + "type": [ + "string", + "null" + ] + }, + "country_id": { + "type": [ + "string", + "null" + ] + }, + "zip": { + "type": [ + "string", + "null" + ] + }, + "phone": { + "type": [ + "string", + "null" + ] + }, + "fax": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "title": "CustomerProfileRequest" + }, + "CustomerRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "email": { + "type": [ + "string", + "null" + ] + }, + "password": { + "type": [ + "string", + "null" + ] + }, + "phone": { + "type": [ + "string", + "null" + ] + }, + "company_name": { + "type": [ + "string", + "null" + ] + }, + "contact_name": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "prefix": { + "type": [ + "string", + "null" + ] + }, + "tax_id": { + "type": [ + "string", + "null" + ] + }, + "enable_portal": { + "type": "boolean" + }, + "currency_id": { + "type": [ + "string", + "null" + ] + }, + "billing": { + "type": "object", + "properties": { + "name": { + "type": [ + "string", + "null" + ] + }, + "address_street_1": { + "type": [ + "string", + "null" + ] + }, + "address_street_2": { + "type": [ + "string", + "null" + ] + }, + "city": { + "type": [ + "string", + "null" + ] + }, + "state": { + "type": [ + "string", + "null" + ] + }, + "country_id": { + "type": [ + "string", + "null" + ] + }, + "zip": { + "type": [ + "string", + "null" + ] + }, + "phone": { + "type": [ + "string", + "null" + ] + }, + "fax": { + "type": [ + "string", + "null" + ] + } + } + }, + "shipping": { + "type": "object", + "properties": { + "name": { + "type": [ + "string", + "null" + ] + }, + "address_street_1": { + "type": [ + "string", + "null" + ] + }, + "address_street_2": { + "type": [ + "string", + "null" + ] + }, + "city": { + "type": [ + "string", + "null" + ] + }, + "state": { + "type": [ + "string", + "null" + ] + }, + "country_id": { + "type": [ + "string", + "null" + ] + }, + "zip": { + "type": [ + "string", + "null" + ] + }, + "phone": { + "type": [ + "string", + "null" + ] + }, + "fax": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "required": [ + "name" + ], + "title": "CustomerRequest" + }, + "CustomerResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "email": { + "type": [ + "string", + "null" + ] + }, + "phone": { + "type": [ + "string", + "null" + ] + }, + "contact_name": { + "type": [ + "string", + "null" + ] + }, + "company_name": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "enable_portal": { + "type": "boolean" + }, + "password_added": { + "type": "boolean" + }, + "currency_id": { + "type": [ + "integer", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "facebook_id": { + "type": [ + "string", + "null" + ] + }, + "google_id": { + "type": [ + "string", + "null" + ] + }, + "github_id": { + "type": [ + "string", + "null" + ] + }, + "created_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "formatted_created_at": { + "type": "string" + }, + "updated_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "avatar": { + "type": "string" + }, + "due_amount": { + "type": "string" + }, + "base_due_amount": { + "type": "string" + }, + "prefix": { + "type": [ + "string", + "null" + ] + }, + "tax_id": { + "type": [ + "string", + "null" + ] + }, + "billing": { + "$ref": "#/components/schemas/AddressResource" + }, + "shipping": { + "$ref": "#/components/schemas/AddressResource" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomFieldValueResource" + } + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + }, + "currency": { + "$ref": "#/components/schemas/CurrencyResource" + } + }, + "required": [ + "id", + "name", + "email", + "phone", + "contact_name", + "company_name", + "website", + "enable_portal", + "password_added", + "currency_id", + "company_id", + "facebook_id", + "google_id", + "github_id", + "created_at", + "formatted_created_at", + "updated_at", + "avatar", + "due_amount", + "base_due_amount", + "prefix", + "tax_id" + ], + "title": "CustomerResource" + }, + "DatabaseEnvironmentRequest": { + "type": "object", + "properties": { + "app_url": { + "type": "string", + "format": "uri" + }, + "database_connection": { + "type": "string" + }, + "database_hostname": { + "type": "string" + }, + "database_port": { + "type": "number" + }, + "database_name": { + "type": "string" + }, + "database_username": { + "type": "string" + }, + "database_overwrite": { + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "app_url", + "database_connection", + "database_hostname", + "database_port", + "database_name", + "database_username" + ], + "title": "DatabaseEnvironmentRequest" + }, + "DeleteCustomersRequest": { + "type": "object", + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + }, + "required": [ + "ids" + ], + "title": "DeleteCustomersRequest" + }, + "DeleteEstimatesRequest": { + "type": "object", + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + }, + "required": [ + "ids" + ], + "title": "DeleteEstimatesRequest" + }, + "DeleteExpensesRequest": { + "type": "object", + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + }, + "required": [ + "ids" + ], + "title": "DeleteExpensesRequest" + }, + "DeleteInvoiceRequest": { + "type": "object", + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + }, + "required": [ + "ids" + ], + "title": "DeleteInvoiceRequest" + }, + "DeleteItemsRequest": { + "type": "object", + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + }, + "required": [ + "ids" + ], + "title": "DeleteItemsRequest" + }, + "DeleteMemberRequest": { + "type": "object", + "properties": { + "users": { + "type": "array", + "items": { + "type": "integer" + } + } + }, + "required": [ + "users" + ], + "title": "DeleteMemberRequest" + }, + "DeletePaymentsRequest": { + "type": "object", + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + }, + "required": [ + "ids" + ], + "title": "DeletePaymentsRequest" + }, + "DiskEnvironmentRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "driver": { + "type": "string" + } + }, + "required": [ + "name", + "driver" + ], + "title": "DiskEnvironmentRequest" + }, + "DomainEnvironmentRequest": { + "type": "object", + "properties": { + "app_domain": { + "type": "string" + } + }, + "required": [ + "app_domain" + ], + "title": "DomainEnvironmentRequest" + }, + "Estimate": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "estimate_date": { + "type": "string" + }, + "expiry_date": { + "type": [ + "string", + "null" + ] + }, + "estimate_number": { + "type": "string" + }, + "status": { + "type": "string" + }, + "reference_number": { + "type": [ + "string", + "null" + ] + }, + "tax_per_item": { + "type": "string" + }, + "discount_per_item": { + "type": "string" + }, + "notes": { + "type": [ + "string", + "null" + ] + }, + "discount": { + "type": [ + "number", + "null" + ] + }, + "discount_type": { + "type": [ + "string", + "null" + ] + }, + "discount_val": { + "type": [ + "integer", + "null" + ] + }, + "sub_total": { + "type": "integer" + }, + "total": { + "type": "integer" + }, + "tax": { + "type": "integer" + }, + "unique_hash": { + "type": [ + "string", + "null" + ] + }, + "user_id": { + "type": [ + "integer", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "created_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "updated_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "creator_id": { + "type": [ + "integer", + "null" + ] + }, + "template_name": { + "type": [ + "string", + "null" + ] + }, + "customer_id": { + "type": [ + "integer", + "null" + ] + }, + "exchange_rate": { + "type": [ + "number", + "null" + ] + }, + "base_discount_val": { + "type": [ + "integer", + "null" + ] + }, + "base_sub_total": { + "type": [ + "integer", + "null" + ] + }, + "base_total": { + "type": [ + "integer", + "null" + ] + }, + "base_tax": { + "type": [ + "integer", + "null" + ] + }, + "currency_id": { + "type": [ + "integer", + "null" + ] + }, + "sequence_number": { + "type": [ + "integer", + "null" + ] + }, + "customer_sequence_number": { + "type": [ + "integer", + "null" + ] + }, + "sales_tax_type": { + "type": [ + "string", + "null" + ] + }, + "sales_tax_address_type": { + "type": [ + "string", + "null" + ] + }, + "tax_included": { + "type": "integer" + } + }, + "required": [ + "id", + "estimate_date", + "expiry_date", + "estimate_number", + "status", + "reference_number", + "tax_per_item", + "discount_per_item", + "notes", + "discount", + "discount_type", + "discount_val", + "sub_total", + "total", + "tax", + "unique_hash", + "user_id", + "company_id", + "created_at", + "updated_at", + "creator_id", + "template_name", + "customer_id", + "exchange_rate", + "base_discount_val", + "base_sub_total", + "base_total", + "base_tax", + "currency_id", + "sequence_number", + "customer_sequence_number", + "sales_tax_type", + "sales_tax_address_type", + "tax_included" + ], + "title": "Estimate" + }, + "EstimateItemResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "discount_type": { + "type": "string" + }, + "quantity": { + "type": "number" + }, + "unit_name": { + "type": [ + "string", + "null" + ] + }, + "discount": { + "type": [ + "number", + "null" + ] + }, + "discount_val": { + "type": [ + "integer", + "null" + ] + }, + "price": { + "type": "integer" + }, + "tax": { + "type": "integer" + }, + "total": { + "type": "integer" + }, + "item_id": { + "type": [ + "integer", + "null" + ] + }, + "estimate_id": { + "type": "integer" + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "exchange_rate": { + "type": [ + "string", + "null" + ] + }, + "base_discount_val": { + "type": [ + "integer", + "null" + ] + }, + "base_price": { + "type": [ + "integer", + "null" + ] + }, + "base_tax": { + "type": [ + "integer", + "null" + ] + }, + "base_total": { + "type": [ + "integer", + "null" + ] + }, + "taxes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TaxResource" + } + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomFieldValueResource" + } + } + }, + "required": [ + "id", + "name", + "description", + "discount_type", + "quantity", + "unit_name", + "discount", + "discount_val", + "price", + "tax", + "total", + "item_id", + "estimate_id", + "company_id", + "exchange_rate", + "base_discount_val", + "base_price", + "base_tax", + "base_total" + ], + "title": "EstimateItemResource" + }, + "EstimateResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "estimate_date": { + "type": "string" + }, + "expiry_date": { + "type": [ + "string", + "null" + ] + }, + "estimate_number": { + "type": "string" + }, + "status": { + "type": "string" + }, + "reference_number": { + "type": [ + "string", + "null" + ] + }, + "tax_per_item": { + "type": "string" + }, + "tax_included": { + "type": "integer" + }, + "discount_per_item": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "discount": { + "type": [ + "number", + "null" + ] + }, + "discount_type": { + "type": [ + "string", + "null" + ] + }, + "discount_val": { + "type": [ + "integer", + "null" + ] + }, + "sub_total": { + "type": "integer" + }, + "total": { + "type": "integer" + }, + "tax": { + "type": "integer" + }, + "unique_hash": { + "type": [ + "string", + "null" + ] + }, + "creator_id": { + "type": [ + "integer", + "null" + ] + }, + "template_name": { + "type": [ + "string", + "null" + ] + }, + "customer_id": { + "type": [ + "integer", + "null" + ] + }, + "exchange_rate": { + "type": [ + "number", + "null" + ] + }, + "base_discount_val": { + "type": [ + "integer", + "null" + ] + }, + "base_sub_total": { + "type": [ + "integer", + "null" + ] + }, + "base_total": { + "type": [ + "integer", + "null" + ] + }, + "base_tax": { + "type": [ + "integer", + "null" + ] + }, + "sequence_number": { + "type": [ + "integer", + "null" + ] + }, + "currency_id": { + "type": [ + "integer", + "null" + ] + }, + "formatted_expiry_date": { + "type": "string" + }, + "formatted_estimate_date": { + "type": "string" + }, + "estimate_pdf_url": { + "type": "string" + }, + "sales_tax_type": { + "type": [ + "string", + "null" + ] + }, + "sales_tax_address_type": { + "type": [ + "string", + "null" + ] + }, + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EstimateItemResource" + } + }, + "customer": { + "$ref": "#/components/schemas/CustomerResource" + }, + "creator": { + "$ref": "#/components/schemas/UserResource" + }, + "taxes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TaxResource" + } + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomFieldValueResource" + } + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + }, + "currency": { + "$ref": "#/components/schemas/CurrencyResource" + } + }, + "required": [ + "id", + "estimate_date", + "expiry_date", + "estimate_number", + "status", + "reference_number", + "tax_per_item", + "tax_included", + "discount_per_item", + "notes", + "discount", + "discount_type", + "discount_val", + "sub_total", + "total", + "tax", + "unique_hash", + "creator_id", + "template_name", + "customer_id", + "exchange_rate", + "base_discount_val", + "base_sub_total", + "base_total", + "base_tax", + "sequence_number", + "currency_id", + "formatted_expiry_date", + "formatted_estimate_date", + "estimate_pdf_url", + "sales_tax_type", + "sales_tax_address_type" + ], + "title": "EstimateResource" + }, + "EstimatesRequest": { + "type": "object", + "properties": { + "estimate_date": { + "type": "string" + }, + "expiry_date": { + "type": [ + "string", + "null" + ] + }, + "customer_id": { + "type": "string" + }, + "estimate_number": { + "type": "string" + }, + "exchange_rate": { + "type": [ + "string", + "null" + ] + }, + "discount": { + "type": "number" + }, + "discount_val": { + "type": "integer" + }, + "sub_total": { + "type": "integer" + }, + "total": { + "type": "integer", + "maximum": 999999999999 + }, + "tax": { + "type": "string" + }, + "template_name": { + "type": "string" + }, + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "description": { + "type": [ + "string", + "null" + ] + }, + "name": { + "type": "string" + }, + "quantity": { + "type": "number" + }, + "price": { + "type": "integer" + } + }, + "required": [ + "name", + "quantity", + "price" + ] + }, + "minItems": 1 + } + }, + "required": [ + "estimate_date", + "customer_id", + "estimate_number", + "discount", + "discount_val", + "sub_total", + "total", + "tax", + "template_name", + "items" + ], + "title": "EstimatesRequest" + }, + "ExchangeRateProviderRequest": { + "type": "object", + "properties": { + "driver": { + "type": "string" + }, + "key": { + "type": "string" + }, + "active": { + "type": [ + "boolean", + "null" + ] + }, + "currencies": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "string", + "null" + ] + } + }, + "driver_config": { + "type": [ + "object", + "null" + ], + "properties": { + "url": { + "type": [ + "string", + "null" + ], + "format": "uri", + "description": "Only the CurrencyConverter \"DEDICATED\" plan reads a custom URL from\ndriver_config; guard it against SSRF (private/reserved targets)." + } + } + } + }, + "required": [ + "driver", + "key" + ], + "title": "ExchangeRateProviderRequest" + }, + "ExchangeRateProviderResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "key": { + "type": "string" + }, + "driver": { + "type": "string" + }, + "currencies": { + "type": [ + "string", + "null" + ] + }, + "driver_config": { + "type": [ + "string", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "active": { + "type": "boolean" + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "required": [ + "id", + "key", + "driver", + "currencies", + "driver_config", + "company_id", + "active" + ], + "title": "ExchangeRateProviderResource" + }, + "ExpenseCategoryRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "name" + ], + "title": "ExpenseCategoryRequest" + }, + "ExpenseCategoryResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "amount": { + "type": "string" + }, + "formatted_created_at": { + "type": "string" + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "required": [ + "id", + "name", + "description", + "company_id", + "amount", + "formatted_created_at" + ], + "title": "ExpenseCategoryResource" + }, + "ExpenseRequest": { + "type": "object", + "properties": { + "expense_date": { + "type": "string" + }, + "expense_number": { + "type": [ + "string", + "null" + ], + "maxLength": 255 + }, + "expense_category_id": { + "type": "string" + }, + "exchange_rate": { + "type": [ + "string", + "null" + ] + }, + "payment_method_id": { + "type": [ + "string", + "null" + ] + }, + "amount": { + "type": "string" + }, + "customer_id": { + "type": [ + "string", + "null" + ] + }, + "notes": { + "type": [ + "string", + "null" + ] + }, + "currency_id": { + "type": "string" + }, + "attachment_receipt": { + "type": [ + "string", + "null" + ], + "format": "binary", + "contentMediaType": "application/octet-stream", + "maxLength": 20000 + } + }, + "required": [ + "expense_date", + "expense_category_id", + "amount", + "currency_id" + ], + "title": "ExpenseRequest" + }, + "ExpenseResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "expense_date": { + "type": "string" + }, + "expense_number": { + "type": [ + "string", + "null" + ] + }, + "amount": { + "type": "integer" + }, + "notes": { + "type": [ + "string", + "null" + ] + }, + "customer_id": { + "type": [ + "integer", + "null" + ] + }, + "attachment_receipt_url": { + "type": "string" + }, + "attachment_receipt": { + "type": "string" + }, + "attachment_receipt_meta": { + "type": "string" + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "expense_category_id": { + "type": "integer" + }, + "creator_id": { + "type": [ + "integer", + "null" + ] + }, + "formatted_expense_date": { + "type": "string" + }, + "formatted_created_at": { + "type": "string" + }, + "exchange_rate": { + "type": [ + "number", + "null" + ] + }, + "currency_id": { + "type": [ + "integer", + "null" + ] + }, + "base_amount": { + "type": [ + "integer", + "null" + ] + }, + "payment_method_id": { + "type": [ + "integer", + "null" + ] + }, + "customer": { + "$ref": "#/components/schemas/CustomerResource" + }, + "expense_category": { + "$ref": "#/components/schemas/ExpenseCategoryResource" + }, + "creator": { + "$ref": "#/components/schemas/UserResource" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomFieldValueResource" + } + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + }, + "currency": { + "$ref": "#/components/schemas/CurrencyResource" + }, + "payment_method": { + "$ref": "#/components/schemas/PaymentMethodResource" + } + }, + "required": [ + "id", + "expense_date", + "expense_number", + "amount", + "notes", + "customer_id", + "attachment_receipt_url", + "attachment_receipt", + "attachment_receipt_meta", + "company_id", + "expense_category_id", + "creator_id", + "formatted_expense_date", + "formatted_created_at", + "exchange_rate", + "currency_id", + "base_amount", + "payment_method_id" + ], + "title": "ExpenseResource" + }, + "FileDiskResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "driver": { + "type": "string" + }, + "set_as_default": { + "type": "boolean" + }, + "credentials": { + "type": "string" + }, + "company_id": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "type", + "driver", + "set_as_default", + "credentials", + "company_id" + ], + "title": "FileDiskResource" + }, + "Invoice": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "invoice_date": { + "type": "string" + }, + "due_date": { + "type": [ + "string", + "null" + ] + }, + "invoice_number": { + "type": "string" + }, + "reference_number": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string" + }, + "paid_status": { + "type": "string" + }, + "tax_per_item": { + "type": "string" + }, + "discount_per_item": { + "type": "string" + }, + "notes": { + "type": [ + "string", + "null" + ] + }, + "discount_type": { + "type": [ + "string", + "null" + ] + }, + "discount": { + "type": [ + "number", + "null" + ] + }, + "discount_val": { + "type": [ + "integer", + "null" + ] + }, + "sub_total": { + "type": "integer" + }, + "total": { + "type": "integer" + }, + "tax": { + "type": "integer" + }, + "due_amount": { + "type": "integer" + }, + "sent": { + "type": "integer" + }, + "viewed": { + "type": "integer" + }, + "unique_hash": { + "type": [ + "string", + "null" + ] + }, + "user_id": { + "type": [ + "integer", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "created_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "updated_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "creator_id": { + "type": [ + "integer", + "null" + ] + }, + "template_name": { + "type": [ + "string", + "null" + ] + }, + "customer_id": { + "type": [ + "integer", + "null" + ] + }, + "recurring_invoice_id": { + "type": [ + "integer", + "null" + ] + }, + "exchange_rate": { + "type": [ + "number", + "null" + ] + }, + "base_discount_val": { + "type": [ + "integer", + "null" + ] + }, + "base_sub_total": { + "type": [ + "integer", + "null" + ] + }, + "base_total": { + "type": [ + "integer", + "null" + ] + }, + "base_tax": { + "type": [ + "integer", + "null" + ] + }, + "base_due_amount": { + "type": [ + "integer", + "null" + ] + }, + "currency_id": { + "type": [ + "integer", + "null" + ] + }, + "sequence_number": { + "type": [ + "integer", + "null" + ] + }, + "customer_sequence_number": { + "type": [ + "integer", + "null" + ] + }, + "sales_tax_type": { + "type": [ + "string", + "null" + ] + }, + "sales_tax_address_type": { + "type": [ + "string", + "null" + ] + }, + "overdue": { + "type": "integer" + }, + "tax_included": { + "type": "integer" + } + }, + "required": [ + "id", + "invoice_date", + "due_date", + "invoice_number", + "reference_number", + "status", + "paid_status", + "tax_per_item", + "discount_per_item", + "notes", + "discount_type", + "discount", + "discount_val", + "sub_total", + "total", + "tax", + "due_amount", + "sent", + "viewed", + "unique_hash", + "user_id", + "company_id", + "created_at", + "updated_at", + "creator_id", + "template_name", + "customer_id", + "recurring_invoice_id", + "exchange_rate", + "base_discount_val", + "base_sub_total", + "base_total", + "base_tax", + "base_due_amount", + "currency_id", + "sequence_number", + "customer_sequence_number", + "sales_tax_type", + "sales_tax_address_type", + "overdue", + "tax_included" + ], + "title": "Invoice" + }, + "InvoiceItemResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "discount_type": { + "type": "string" + }, + "price": { + "type": "integer" + }, + "quantity": { + "type": "number" + }, + "unit_name": { + "type": [ + "string", + "null" + ] + }, + "discount": { + "type": [ + "number", + "null" + ] + }, + "discount_val": { + "type": "integer" + }, + "tax": { + "type": "integer" + }, + "total": { + "type": "integer" + }, + "invoice_id": { + "type": [ + "integer", + "null" + ] + }, + "item_id": { + "type": [ + "integer", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "base_price": { + "type": [ + "integer", + "null" + ] + }, + "exchange_rate": { + "type": [ + "string", + "null" + ] + }, + "base_discount_val": { + "type": [ + "integer", + "null" + ] + }, + "base_tax": { + "type": [ + "integer", + "null" + ] + }, + "base_total": { + "type": [ + "integer", + "null" + ] + }, + "recurring_invoice_id": { + "type": [ + "integer", + "null" + ] + }, + "taxes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TaxResource" + } + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomFieldValueResource" + } + } + }, + "required": [ + "id", + "name", + "description", + "discount_type", + "price", + "quantity", + "unit_name", + "discount", + "discount_val", + "tax", + "total", + "invoice_id", + "item_id", + "company_id", + "base_price", + "exchange_rate", + "base_discount_val", + "base_tax", + "base_total", + "recurring_invoice_id" + ], + "title": "InvoiceItemResource" + }, + "InvoiceResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "invoice_date": { + "type": "string" + }, + "due_date": { + "type": [ + "string", + "null" + ] + }, + "invoice_number": { + "type": "string" + }, + "reference_number": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string" + }, + "paid_status": { + "type": "string" + }, + "tax_per_item": { + "type": "string" + }, + "tax_included": { + "type": "integer" + }, + "discount_per_item": { + "type": "string" + }, + "notes": { + "type": [ + "string", + "null" + ] + }, + "discount_type": { + "type": [ + "string", + "null" + ] + }, + "discount": { + "type": [ + "number", + "null" + ] + }, + "discount_val": { + "type": [ + "integer", + "null" + ] + }, + "sub_total": { + "type": "integer" + }, + "total": { + "type": "integer" + }, + "tax": { + "type": "integer" + }, + "due_amount": { + "type": "integer" + }, + "sent": { + "type": "integer" + }, + "viewed": { + "type": "integer" + }, + "unique_hash": { + "type": [ + "string", + "null" + ] + }, + "template_name": { + "type": [ + "string", + "null" + ] + }, + "customer_id": { + "type": [ + "integer", + "null" + ] + }, + "recurring_invoice_id": { + "type": [ + "integer", + "null" + ] + }, + "sequence_number": { + "type": [ + "integer", + "null" + ] + }, + "exchange_rate": { + "type": [ + "number", + "null" + ] + }, + "base_discount_val": { + "type": [ + "integer", + "null" + ] + }, + "base_sub_total": { + "type": [ + "integer", + "null" + ] + }, + "base_total": { + "type": [ + "integer", + "null" + ] + }, + "creator_id": { + "type": [ + "integer", + "null" + ] + }, + "base_tax": { + "type": [ + "integer", + "null" + ] + }, + "base_due_amount": { + "type": [ + "integer", + "null" + ] + }, + "currency_id": { + "type": [ + "integer", + "null" + ] + }, + "formatted_created_at": { + "type": "string" + }, + "invoice_pdf_url": { + "type": "string" + }, + "formatted_invoice_date": { + "type": "string" + }, + "formatted_due_date": { + "type": "string" + }, + "allow_edit": { + "type": "string" + }, + "payment_module_enabled": { + "type": "string" + }, + "sales_tax_type": { + "type": [ + "string", + "null" + ] + }, + "sales_tax_address_type": { + "type": [ + "string", + "null" + ] + }, + "overdue": { + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InvoiceItemResource" + } + }, + "customer": { + "$ref": "#/components/schemas/CustomerResource" + }, + "creator": { + "$ref": "#/components/schemas/UserResource" + }, + "taxes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TaxResource" + } + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomFieldValueResource" + } + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + }, + "currency": { + "$ref": "#/components/schemas/CurrencyResource" + } + }, + "required": [ + "id", + "invoice_date", + "due_date", + "invoice_number", + "reference_number", + "status", + "paid_status", + "tax_per_item", + "tax_included", + "discount_per_item", + "notes", + "discount_type", + "discount", + "discount_val", + "sub_total", + "total", + "tax", + "due_amount", + "sent", + "viewed", + "unique_hash", + "template_name", + "customer_id", + "recurring_invoice_id", + "sequence_number", + "exchange_rate", + "base_discount_val", + "base_sub_total", + "base_total", + "creator_id", + "base_tax", + "base_due_amount", + "currency_id", + "formatted_created_at", + "invoice_pdf_url", + "formatted_invoice_date", + "formatted_due_date", + "allow_edit", + "payment_module_enabled", + "sales_tax_type", + "sales_tax_address_type", + "overdue" + ], + "title": "InvoiceResource" + }, + "InvoicesRequest": { + "type": "object", + "properties": { + "invoice_date": { + "type": "string" + }, + "due_date": { + "type": [ + "string", + "null" + ] + }, + "customer_id": { + "type": "string" + }, + "invoice_number": { + "type": "string" + }, + "exchange_rate": { + "type": [ + "string", + "null" + ] + }, + "discount": { + "type": "number" + }, + "discount_val": { + "type": "integer" + }, + "sub_total": { + "type": "number" + }, + "total": { + "type": "number", + "maximum": 999999999999 + }, + "tax": { + "type": "string" + }, + "template_name": { + "type": "string" + }, + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "description": { + "type": [ + "string", + "null" + ] + }, + "name": { + "type": "string" + }, + "quantity": { + "type": "number" + }, + "price": { + "type": "number" + } + }, + "required": [ + "name", + "quantity", + "price" + ] + }, + "minItems": 1 + } + }, + "required": [ + "invoice_date", + "customer_id", + "invoice_number", + "discount", + "discount_val", + "sub_total", + "total", + "tax", + "template_name", + "items" + ], + "title": "InvoicesRequest" + }, + "ItemResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "price": { + "type": "integer" + }, + "unit_id": { + "type": [ + "integer", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "creator_id": { + "type": [ + "integer", + "null" + ] + }, + "currency_id": { + "type": [ + "integer", + "null" + ] + }, + "created_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "updated_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "tax_per_item": { + "type": "integer" + }, + "formatted_created_at": { + "type": "string" + }, + "unit": { + "$ref": "#/components/schemas/UnitResource" + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + }, + "taxes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TaxResource" + } + }, + "currency": { + "$ref": "#/components/schemas/CurrencyResource" + } + }, + "required": [ + "id", + "name", + "description", + "price", + "unit_id", + "company_id", + "creator_id", + "currency_id", + "created_at", + "updated_at", + "tax_per_item", + "formatted_created_at" + ], + "title": "ItemResource" + }, + "ItemsRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "price": { + "type": "string" + }, + "unit_id": { + "type": [ + "string", + "null" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "name", + "price" + ], + "title": "ItemsRequest" + }, + "LoginRequest": { + "type": "object", + "properties": { + "username": { + "type": "string" + }, + "password": { + "type": "string" + }, + "device_name": { + "type": "string" + } + }, + "required": [ + "username", + "password", + "device_name" + ], + "title": "LoginRequest" + }, + "MailEnvironmentRequest": { + "type": "object", + "properties": { + "mail_driver": { + "type": "string", + "enum": [ + "sendmail", + "smtp", + "mail", + "ses", + "mailgun", + "postmark" + ] + }, + "from_name": { + "type": "string" + }, + "from_mail": { + "type": "string", + "format": "email" + }, + "mail_sendmail_path": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "mail_driver", + "from_name", + "from_mail" + ], + "title": "MailEnvironmentRequest" + }, + "MemberRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "email": { + "type": "string" + }, + "phone": { + "type": [ + "string", + "null" + ] + }, + "password": { + "type": "string", + "minLength": 8 + }, + "companies": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "role": { + "type": "string" + } + }, + "required": [ + "id", + "role" + ] + } + } + }, + "required": [ + "name", + "email", + "password", + "companies" + ], + "title": "MemberRequest" + }, + "ModuleResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "average_rating": { + "type": "string" + }, + "cover": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "module_name": { + "type": "string" + }, + "access_tier": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "public" + ] + } + ] + }, + "faq": { + "type": "string" + }, + "highlights": { + "type": "string" + }, + "installed_module_version": { + "type": [ + "string", + "null" + ] + }, + "installed_module_version_updated_at": { + "type": [ + "string", + "null" + ] + }, + "latest_module_version": { + "type": "string" + }, + "latest_module_version_updated_at": { + "type": "string" + }, + "latest_min_invoiceshelf_version": { + "type": [ + "string", + "null" + ] + }, + "latest_module_checksum_sha256": { + "type": [ + "string", + "null" + ] + }, + "is_dev": { + "type": "string" + }, + "license": { + "type": "string" + }, + "long_description": { + "type": "string" + }, + "monthly_price": { + "type": "string" + }, + "name": { + "type": "string" + }, + "purchased": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "boolean" + } + ] + }, + "reviews": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 0, + "maxItems": 0, + "additionalItems": false + } + ] + }, + "screenshots": { + "type": "string" + }, + "short_description": { + "type": "string" + }, + "type": { + "type": "string" + }, + "yearly_price": { + "type": "string" + }, + "author_name": { + "type": "string" + }, + "author_avatar": { + "type": "string" + }, + "installed": { + "type": "boolean" + }, + "enabled": { + "type": "boolean" + }, + "update_available": { + "type": "boolean" + }, + "video_link": { + "type": "string" + }, + "video_thumbnail": { + "type": "string" + }, + "links": { + "type": "string" + } + }, + "required": [ + "id", + "average_rating", + "cover", + "slug", + "module_name", + "access_tier", + "faq", + "highlights", + "installed_module_version", + "installed_module_version_updated_at", + "latest_module_version", + "latest_module_version_updated_at", + "latest_min_invoiceshelf_version", + "latest_module_checksum_sha256", + "is_dev", + "license", + "long_description", + "monthly_price", + "name", + "purchased", + "reviews", + "screenshots", + "short_description", + "type", + "yearly_price", + "author_name", + "author_avatar", + "installed", + "enabled", + "update_available", + "video_link", + "video_thumbnail", + "links" + ], + "title": "ModuleResource" + }, + "NoteResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "name": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "is_default": { + "type": "integer" + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "required": [ + "id", + "type", + "name", + "notes", + "is_default" + ], + "title": "NoteResource" + }, + "NotesRequest": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "name": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "is_default": { + "type": "string" + } + }, + "required": [ + "type", + "name", + "notes", + "is_default" + ], + "title": "NotesRequest" + }, + "PDFConfigurationRequest": { + "type": "object", + "properties": { + "pdf_driver": { + "type": "string" + } + }, + "required": [ + "pdf_driver" + ], + "title": "PDFConfigurationRequest" + }, + "PaymentMethodRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "title": "PaymentMethodRequest" + }, + "PaymentMethodResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "type": { + "type": "string" + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "required": [ + "id", + "name", + "company_id", + "type" + ], + "title": "PaymentMethodResource" + }, + "PaymentRequest": { + "type": "object", + "properties": { + "payment_date": { + "type": "string" + }, + "customer_id": { + "type": "string" + }, + "exchange_rate": { + "type": [ + "string", + "null" + ] + }, + "amount": { + "type": "string" + }, + "payment_number": { + "type": "string" + }, + "invoice_id": { + "type": [ + "string", + "null" + ] + }, + "payment_method_id": { + "type": [ + "string", + "null" + ] + }, + "notes": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "payment_date", + "customer_id", + "amount", + "payment_number" + ], + "title": "PaymentRequest" + }, + "PaymentResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "payment_number": { + "type": "string" + }, + "payment_date": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "amount": { + "type": "integer" + }, + "unique_hash": { + "type": [ + "string", + "null" + ] + }, + "invoice_id": { + "type": [ + "integer", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "payment_method_id": { + "type": [ + "integer", + "null" + ] + }, + "creator_id": { + "type": [ + "integer", + "null" + ] + }, + "customer_id": { + "type": [ + "integer", + "null" + ] + }, + "exchange_rate": { + "type": [ + "number", + "null" + ] + }, + "base_amount": { + "type": [ + "integer", + "null" + ] + }, + "currency_id": { + "type": [ + "integer", + "null" + ] + }, + "transaction_id": { + "type": [ + "integer", + "null" + ] + }, + "sequence_number": { + "type": [ + "integer", + "null" + ] + }, + "formatted_created_at": { + "type": "string" + }, + "formatted_payment_date": { + "type": "string" + }, + "payment_pdf_url": { + "type": "string" + }, + "customer": { + "$ref": "#/components/schemas/CustomerResource" + }, + "invoice": { + "$ref": "#/components/schemas/InvoiceResource" + }, + "payment_method": { + "$ref": "#/components/schemas/PaymentMethodResource" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomFieldValueResource" + } + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + }, + "currency": { + "$ref": "#/components/schemas/CurrencyResource" + }, + "transaction": { + "$ref": "#/components/schemas/TransactionResource" + } + }, + "required": [ + "id", + "payment_number", + "payment_date", + "notes", + "amount", + "unique_hash", + "invoice_id", + "company_id", + "payment_method_id", + "creator_id", + "customer_id", + "exchange_rate", + "base_amount", + "currency_id", + "transaction_id", + "sequence_number", + "formatted_created_at", + "formatted_payment_date", + "payment_pdf_url" + ], + "title": "PaymentResource" + }, + "ProfileRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "password": { + "type": [ + "string", + "null" + ], + "minLength": 8 + }, + "email": { + "type": "string" + } + }, + "required": [ + "name", + "email" + ], + "title": "ProfileRequest" + }, + "RecurringInvoiceRequest": { + "type": "object", + "properties": { + "starts_at": { + "type": "string" + }, + "send_automatically": { + "type": "boolean" + }, + "customer_id": { + "type": "string" + }, + "exchange_rate": { + "type": [ + "string", + "null" + ] + }, + "discount": { + "type": "number" + }, + "discount_val": { + "type": "integer" + }, + "sub_total": { + "type": "integer" + }, + "total": { + "type": "integer", + "maximum": 999999999999 + }, + "tax": { + "type": "string" + }, + "status": { + "type": "string" + }, + "frequency": { + "type": "string" + }, + "limit_by": { + "type": "string" + }, + "limit_count": { + "type": "string" + }, + "limit_date": { + "type": "string" + }, + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "description": { + "type": [ + "string", + "null" + ] + } + } + } + } + }, + "required": [ + "starts_at", + "send_automatically", + "customer_id", + "discount", + "discount_val", + "sub_total", + "total", + "tax", + "status", + "frequency", + "limit_by", + "items" + ], + "title": "RecurringInvoiceRequest" + }, + "RecurringInvoiceResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "starts_at": { + "type": "string" + }, + "formatted_starts_at": { + "type": "string" + }, + "formatted_created_at": { + "type": "string" + }, + "formatted_next_invoice_at": { + "type": "string" + }, + "formatted_limit_date": { + "type": "string" + }, + "send_automatically": { + "type": "boolean" + }, + "customer_id": { + "type": [ + "integer", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "creator_id": { + "type": [ + "integer", + "null" + ] + }, + "status": { + "type": "string" + }, + "next_invoice_at": { + "type": [ + "string", + "null" + ] + }, + "frequency": { + "type": "string" + }, + "limit_by": { + "type": "string" + }, + "limit_count": { + "type": [ + "integer", + "null" + ] + }, + "limit_date": { + "type": [ + "string", + "null" + ] + }, + "exchange_rate": { + "type": [ + "number", + "null" + ] + }, + "tax_per_item": { + "type": "string" + }, + "tax_included": { + "type": "integer" + }, + "discount_per_item": { + "type": "string" + }, + "notes": { + "type": [ + "string", + "null" + ] + }, + "discount_type": { + "type": [ + "string", + "null" + ] + }, + "discount": { + "type": [ + "string", + "null" + ] + }, + "discount_val": { + "type": [ + "integer", + "null" + ] + }, + "sub_total": { + "type": "integer" + }, + "total": { + "type": "integer" + }, + "tax": { + "type": "integer" + }, + "due_amount": { + "type": "integer" + }, + "template_name": { + "type": [ + "string", + "null" + ] + }, + "sales_tax_type": { + "type": [ + "string", + "null" + ] + }, + "sales_tax_address_type": { + "type": [ + "string", + "null" + ] + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CustomFieldValueResource" + } + }, + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InvoiceItemResource" + } + }, + "customer": { + "$ref": "#/components/schemas/CustomerResource" + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + }, + "invoices": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InvoiceResource" + } + }, + "taxes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TaxResource" + } + }, + "creator": { + "$ref": "#/components/schemas/UserResource" + }, + "currency": { + "$ref": "#/components/schemas/CurrencyResource" + } + }, + "required": [ + "id", + "starts_at", + "formatted_starts_at", + "formatted_created_at", + "formatted_next_invoice_at", + "formatted_limit_date", + "send_automatically", + "customer_id", + "company_id", + "creator_id", + "status", + "next_invoice_at", + "frequency", + "limit_by", + "limit_count", + "limit_date", + "exchange_rate", + "tax_per_item", + "tax_included", + "discount_per_item", + "notes", + "discount_type", + "discount", + "discount_val", + "sub_total", + "total", + "tax", + "due_amount", + "template_name", + "sales_tax_type", + "sales_tax_address_type" + ], + "title": "RecurringInvoiceResource" + }, + "Role": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "level": { + "type": [ + "integer", + "null" + ] + }, + "scope": { + "type": [ + "integer", + "null" + ] + }, + "created_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "updated_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + } + }, + "required": [ + "id", + "name", + "title", + "level", + "scope", + "created_at", + "updated_at" + ], + "title": "Role" + }, + "RoleRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "abilities": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "name", + "abilities" + ], + "title": "RoleRequest" + }, + "RoleResource": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "title": { + "type": "string" + }, + "level": { + "type": "string" + }, + "formatted_created_at": { + "type": "string" + }, + "abilities": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "title", + "level", + "formatted_created_at", + "abilities" + ], + "title": "RoleResource" + }, + "SendEstimatesRequest": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "body": { + "type": "string" + }, + "from": { + "type": "string" + }, + "to": { + "type": "string" + }, + "cc": { + "type": [ + "string", + "null" + ] + }, + "bcc": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "subject", + "body", + "from", + "to" + ], + "title": "SendEstimatesRequest" + }, + "SendInvoiceRequest": { + "type": "object", + "properties": { + "body": { + "type": "string" + }, + "subject": { + "type": "string" + }, + "from": { + "type": "string" + }, + "to": { + "type": "string" + }, + "cc": { + "type": [ + "string", + "null" + ] + }, + "bcc": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "body", + "subject", + "from", + "to" + ], + "title": "SendInvoiceRequest" + }, + "SendPaymentRequest": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "body": { + "type": "string" + }, + "from": { + "type": "string" + }, + "to": { + "type": "string" + }, + "cc": { + "type": [ + "string", + "null" + ] + }, + "bcc": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "subject", + "body", + "from", + "to" + ], + "title": "SendPaymentRequest" + }, + "SettingRequest": { + "type": "object", + "properties": { + "settings": { + "type": "string" + } + }, + "required": [ + "settings" + ], + "title": "SettingRequest" + }, + "TaxResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "tax_type_id": { + "type": "integer" + }, + "invoice_id": { + "type": [ + "integer", + "null" + ] + }, + "estimate_id": { + "type": [ + "integer", + "null" + ] + }, + "invoice_item_id": { + "type": [ + "integer", + "null" + ] + }, + "estimate_item_id": { + "type": [ + "integer", + "null" + ] + }, + "item_id": { + "type": [ + "integer", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "name": { + "type": "string" + }, + "amount": { + "type": "integer" + }, + "percent": { + "type": [ + "number", + "null" + ] + }, + "calculation_type": { + "type": "string" + }, + "fixed_amount": { + "type": [ + "integer", + "null" + ] + }, + "compound_tax": { + "type": "integer" + }, + "base_amount": { + "type": [ + "integer", + "null" + ] + }, + "currency_id": { + "type": [ + "integer", + "null" + ] + }, + "type": { + "type": "string" + }, + "recurring_invoice_id": { + "type": [ + "integer", + "null" + ] + }, + "tax_type": { + "$ref": "#/components/schemas/TaxTypeResource" + }, + "currency": { + "$ref": "#/components/schemas/CurrencyResource" + } + }, + "required": [ + "id", + "tax_type_id", + "invoice_id", + "estimate_id", + "invoice_item_id", + "estimate_item_id", + "item_id", + "company_id", + "name", + "amount", + "percent", + "calculation_type", + "fixed_amount", + "compound_tax", + "base_amount", + "currency_id", + "type", + "recurring_invoice_id" + ], + "title": "TaxResource" + }, + "TaxType": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "percent": { + "type": [ + "number", + "null" + ] + }, + "compound_tax": { + "type": "boolean" + }, + "collective_tax": { + "type": "integer" + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "created_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "updated_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "type": { + "type": "string" + }, + "calculation_type": { + "type": "string" + }, + "fixed_amount": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "id", + "name", + "percent", + "compound_tax", + "collective_tax", + "description", + "company_id", + "created_at", + "updated_at", + "type", + "calculation_type", + "fixed_amount" + ], + "title": "TaxType" + }, + "TaxTypeRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "calculation_type": { + "type": "string", + "enum": [ + "percentage", + "fixed" + ] + }, + "percent": { + "type": [ + "number", + "null" + ] + }, + "fixed_amount": { + "type": [ + "number", + "null" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "compound_tax": { + "type": [ + "string", + "null" + ] + }, + "collective_tax": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "name", + "calculation_type" + ], + "title": "TaxTypeRequest" + }, + "TaxTypeResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "percent": { + "type": [ + "number", + "null" + ] + }, + "fixed_amount": { + "type": [ + "integer", + "null" + ] + }, + "calculation_type": { + "type": "string" + }, + "type": { + "type": "string" + }, + "compound_tax": { + "type": "boolean" + }, + "collective_tax": { + "type": "integer" + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "required": [ + "id", + "name", + "percent", + "fixed_amount", + "calculation_type", + "type", + "compound_tax", + "collective_tax", + "description", + "company_id" + ], + "title": "TaxTypeResource" + }, + "TransactionResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "transaction_id": { + "type": [ + "string", + "null" + ] + }, + "type": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string" + }, + "transaction_date": { + "type": "string" + }, + "invoice_id": { + "type": "integer" + }, + "invoice": { + "$ref": "#/components/schemas/InvoiceResource" + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "required": [ + "id", + "transaction_id", + "type", + "status", + "transaction_date", + "invoice_id" + ], + "title": "TransactionResource" + }, + "UnitRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "title": "UnitRequest" + }, + "UnitResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "company": { + "$ref": "#/components/schemas/CompanyResource" + } + }, + "required": [ + "id", + "name", + "company_id" + ], + "title": "UnitResource" + }, + "UnzipUpdateRequest": { + "type": "object", + "properties": { + "path": { + "type": "string", + "pattern": "^[\\.\\/\\w\\-]+$" + }, + "module": { + "type": [ + "string", + "null" + ] + }, + "module_name": { + "type": "string" + } + }, + "required": [ + "path" + ], + "title": "UnzipUpdateRequest" + }, + "UpdateSettingsRequest": { + "type": "object", + "properties": { + "settings": { + "type": "string" + } + }, + "required": [ + "settings" + ], + "title": "UpdateSettingsRequest" + }, + "UploadExpenseReceiptRequest": { + "type": "object", + "properties": { + "attachment_receipt": { + "type": [ + "string", + "null" + ] + } + }, + "title": "UploadExpenseReceiptRequest" + }, + "UploadModuleRequest": { + "type": "object", + "properties": { + "avatar": { + "type": "string", + "format": "binary", + "contentMediaType": "application/octet-stream", + "maxLength": 20000 + }, + "module": { + "type": "string", + "maxLength": 100 + } + }, + "required": [ + "avatar", + "module" + ], + "title": "UploadModuleRequest" + }, + "User": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "email": { + "type": [ + "string", + "null" + ] + }, + "phone": { + "type": [ + "string", + "null" + ] + }, + "role": { + "type": "string" + }, + "facebook_id": { + "type": [ + "string", + "null" + ] + }, + "google_id": { + "type": [ + "string", + "null" + ] + }, + "github_id": { + "type": [ + "string", + "null" + ] + }, + "contact_name": { + "type": [ + "string", + "null" + ] + }, + "company_name": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "enable_portal": { + "type": [ + "integer", + "null" + ] + }, + "currency_id": { + "type": [ + "integer", + "null" + ] + }, + "company_id": { + "type": [ + "integer", + "null" + ] + }, + "created_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "updated_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "creator_id": { + "type": [ + "integer", + "null" + ] + }, + "avatar": { + "type": "string" + }, + "currency": { + "$ref": "#/components/schemas/Currency" + } + }, + "required": [ + "id", + "name", + "email", + "phone", + "role", + "facebook_id", + "google_id", + "github_id", + "contact_name", + "company_name", + "website", + "enable_portal", + "currency_id", + "company_id", + "created_at", + "updated_at", + "creator_id", + "avatar" + ], + "title": "User" + }, + "UserResource": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "email": { + "type": [ + "string", + "null" + ] + }, + "phone": { + "type": [ + "string", + "null" + ] + }, + "role": { + "type": "string" + }, + "contact_name": { + "type": [ + "string", + "null" + ] + }, + "company_name": { + "type": [ + "string", + "null" + ] + }, + "website": { + "type": [ + "string", + "null" + ] + }, + "enable_portal": { + "type": [ + "integer", + "null" + ] + }, + "currency_id": { + "type": [ + "integer", + "null" + ] + }, + "facebook_id": { + "type": [ + "string", + "null" + ] + }, + "google_id": { + "type": [ + "string", + "null" + ] + }, + "github_id": { + "type": [ + "string", + "null" + ] + }, + "created_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "updated_at": { + "type": [ + "string", + "null" + ], + "format": "date-time" + }, + "avatar": { + "type": "string" + }, + "is_owner": { + "type": "boolean" + }, + "is_super_admin": { + "type": "boolean" + }, + "roles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Role" + } + }, + "formatted_created_at": { + "type": "string" + }, + "currency": { + "$ref": "#/components/schemas/CurrencyResource" + }, + "companies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyResource" + } + } + }, + "required": [ + "id", + "name", + "email", + "phone", + "role", + "contact_name", + "company_name", + "website", + "enable_portal", + "currency_id", + "facebook_id", + "google_id", + "github_id", + "created_at", + "updated_at", + "avatar", + "is_owner", + "is_super_admin", + "roles", + "formatted_created_at" + ], + "title": "UserResource" + } + }, + "responses": { + "ValidationException": { + "description": "Validation error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Errors overview." + }, + "errors": { + "type": "object", + "description": "A detailed description of each field that failed validation.", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "required": [ + "message", + "errors" + ] + } + } + } + }, + "AuthenticationException": { + "description": "Unauthenticated", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Error overview." + } + }, + "required": [ + "message" + ] + } + } + } + }, + "ModelNotFoundException": { + "description": "Not found", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Error overview." + } + }, + "required": [ + "message" + ] + } + } + } + }, + "AuthorizationException": { + "description": "Authorization error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Error overview." + } + }, + "required": [ + "message" + ] + } + } + } + } + } + } +} \ No newline at end of file diff --git a/tests/Feature/OpenApiDocumentationTest.php b/tests/Feature/OpenApiDocumentationTest.php new file mode 100644 index 00000000..c54f4c32 --- /dev/null +++ b/tests/Feature/OpenApiDocumentationTest.php @@ -0,0 +1,87 @@ + "method path" for every operation carrying a `company` header */ +function companyHeaderOperations(array $document): array +{ + $matches = []; + + foreach ($document['paths'] as $path => $operations) { + foreach ($operations as $method => $operation) { + if (! is_array($operation)) { + continue; + } + + foreach ($operation['parameters'] ?? [] as $parameter) { + if (($parameter['name'] ?? null) === 'company' && ($parameter['in'] ?? null) === 'header') { + $matches[] = "{$method} {$path}"; + } + } + } + } + + return $matches; +} + +it('generates a valid OpenAPI document for the v1 API', function () { + $document = openApiDocument(); + + expect($document['openapi'] ?? '')->toStartWith('3.') + ->and($document['info']['title'])->toBe('InvoiceShelf API') + ->and($document['info']['version'])->toBe(trim((string) file_get_contents(base_path('version.md')))) + ->and($document['paths'])->not->toBeEmpty(); +}); + +it('advertises bearer token authentication', function () { + $document = openApiDocument(); + + $scheme = collect($document['components']['securitySchemes'] ?? []) + ->firstWhere('scheme', 'bearer'); + + expect($scheme)->not->toBeNull() + ->and($scheme['type'])->toBe('http'); +}); + +it('adds the company header to company-scoped routes', function () { + expect(companyHeaderOperations(openApiDocument()))->not->toBeEmpty(); +}); + +it('does not add the company header to unauthenticated bootstrap routes', function () { + $document = openApiDocument(); + + // /auth/login runs before any tenant is resolved, so it must not require the header. + $loginOperations = $document['paths']['/auth/login'] ?? []; + + $hasCompanyHeader = false; + foreach ($loginOperations as $operation) { + if (! is_array($operation)) { + continue; + } + foreach ($operation['parameters'] ?? [] as $parameter) { + if (($parameter['name'] ?? null) === 'company') { + $hasCompanyHeader = true; + } + } + } + + expect($hasCompanyHeader)->toBeFalse(); +});