diff --git a/.github/workflows/react_release.yml b/.github/workflows/react_release.yml
index 719c5759501c..050ba6965879 100644
--- a/.github/workflows/react_release.yml
+++ b/.github/workflows/react_release.yml
@@ -44,6 +44,7 @@ jobs:
git clone https://${{secrets.commit_secret}}@github.com/invoiceninja/ui.git
cd ui
git checkout develop
+ cp ../vite.config.ts.react ./vite.config.js
npm i
npm run build
cp -r dist/* ../public/
@@ -60,7 +61,8 @@ jobs:
sudo rm -rf node_modules
sudo rm -rf .git
sudo rm .env
-
+ sudo rm -rf ui
+
- name: Build project
run: |
shopt -s dotglob
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 2f672fdcda0e..e2802e6c2f75 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -72,7 +72,6 @@ jobs:
- name: Build project
run: |
- zip -r /home/runner/work/invoiceninja/invoiceninja.zip .* -x "../*"
shopt -s dotglob
tar --exclude='public/storage' --exclude='./htaccess' --exclude='invoiceninja.zip' -zcvf /home/runner/work/invoiceninja/invoiceninja.tar *
- name: Release
@@ -82,5 +81,4 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
files: |
- /home/runner/work/invoiceninja/invoiceninja.tar
- /home/runner/work/invoiceninja/invoiceninja.zip
\ No newline at end of file
+ /home/runner/work/invoiceninja/invoiceninja.tar
\ No newline at end of file
diff --git a/VERSION.txt b/VERSION.txt
index 2151dbda1ec1..7d27289a3da6 100644
--- a/VERSION.txt
+++ b/VERSION.txt
@@ -1 +1 @@
-5.9.2
\ No newline at end of file
+5.9.3
\ No newline at end of file
diff --git a/app/DataMapper/Analytics/DbQuery.php b/app/DataMapper/Analytics/DbQuery.php
index ac65c29b36c0..833aa9707e85 100644
--- a/app/DataMapper/Analytics/DbQuery.php
+++ b/app/DataMapper/Analytics/DbQuery.php
@@ -66,12 +66,14 @@ class DbQuery extends GenericMixedMetric
public $double_metric2 = 1;
- public function __construct($string_metric5, $string_metric6, $int_metric1, $double_metric2, $string_metric7)
+ public function __construct($string_metric5, $string_metric6, $int_metric1, $double_metric2, $string_metric7, $string_metric8, $string_metric9)
{
$this->int_metric1 = $int_metric1;
$this->string_metric5 = $string_metric5;
$this->string_metric6 = $string_metric6;
$this->double_metric2 = $double_metric2;
$this->string_metric7 = $string_metric7;
+ $this->string_metric8 = $string_metric8;
+ $this->string_metric9 = $string_metric9;
}
}
diff --git a/app/DataMapper/CompanySettings.php b/app/DataMapper/CompanySettings.php
index 39662af39b53..aa9bb7064d34 100644
--- a/app/DataMapper/CompanySettings.php
+++ b/app/DataMapper/CompanySettings.php
@@ -29,7 +29,7 @@ class CompanySettings extends BaseSettings
public $besr_id = ''; //@implemented
- public $lock_invoices = 'off'; //off,when_sent,when_paid //@implemented
+ public $lock_invoices = 'off'; //off,when_sent,when_paid,end_of_month //@implemented
public $enable_client_portal_tasks = false; //@ben to implement
diff --git a/app/DataProviders/FACT1.php b/app/DataProviders/FACT1.php
deleted file mode 100644
index 3572e15253bb..000000000000
--- a/app/DataProviders/FACT1.php
+++ /dev/null
@@ -1,24 +0,0 @@
-company->company_key}:{$bank_integration->id}";
+
+ if(Cache::has($cache_key))
+ return;
App::setLocale($bank_integration->company->getLocale());
@@ -163,7 +168,8 @@ class Nordigen
$mo->email_template_subject = 'nordigen_requisition_subject';
Email::dispatch($mo, $bank_integration->company);
-
+
+ Cache::put($cache_key, true, 60 * 60 * 24);
}
diff --git a/app/Http/Controllers/BaseController.php b/app/Http/Controllers/BaseController.php
index f573fa72e00f..92f1d4a6c272 100644
--- a/app/Http/Controllers/BaseController.php
+++ b/app/Http/Controllers/BaseController.php
@@ -38,7 +38,7 @@ use App\Transformers\ArraySerializer;
use App\Transformers\EntityTransformer;
use League\Fractal\Resource\Collection;
use Illuminate\Database\Eloquent\Builder;
-use Invoiceninja\Einvoice\Decoder\Schema;
+use InvoiceNinja\EInvoice\Decoder\Schema;
use League\Fractal\Serializer\JsonApiSerializer;
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use Illuminate\Contracts\Container\BindingResolutionException;
@@ -998,7 +998,7 @@ class BaseController extends Controller
if(request()->has('einvoice')){
$ro = new Schema();
- $response_data['einvoice_schema'] = $ro('FACT1');
+ $response_data['einvoice_schema'] = $ro('Peppol');
}
diff --git a/app/Http/Controllers/CompanyController.php b/app/Http/Controllers/CompanyController.php
index 032ade89cf03..83ffb0a96f77 100644
--- a/app/Http/Controllers/CompanyController.php
+++ b/app/Http/Controllers/CompanyController.php
@@ -117,11 +117,21 @@ class CompanyController extends BaseController
/** @var \App\Models\User $user */
$user = auth()->user();
- $companies = Company::whereAccountId($user->company()->account->id);
+ $companies = Company::where('account_id', $user->company()->account->id);
return $this->listResponse($companies);
}
+ public function current()
+ {
+ /** @var \App\Models\User $user */
+ $user = auth()->user();
+
+ $company = Company::find($user->company()->id);
+
+ return $this->itemResponse($company);
+ }
+
/**
* Show the form for creating a new resource.
*
diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php
index 79e348288788..c307e6302d01 100644
--- a/app/Http/Controllers/InvoiceController.php
+++ b/app/Http/Controllers/InvoiceController.php
@@ -408,7 +408,7 @@ class InvoiceController extends BaseController
}
if ($invoice->isLocked()) {
- return response()->json(['message' => ctrans('texts.locked_invoice')], 422);
+ return response()->json(['message' => '', 'errors' => ['number' => ctrans('texts.locked_invoice')]], 422);
}
$old_invoice = $invoice->line_items;
diff --git a/app/Http/Controllers/StaticController.php b/app/Http/Controllers/StaticController.php
index 71403d055d1b..0a8f584d1bf2 100644
--- a/app/Http/Controllers/StaticController.php
+++ b/app/Http/Controllers/StaticController.php
@@ -13,7 +13,7 @@ namespace App\Http\Controllers;
use App\Utils\Statics;
use Illuminate\Http\Response;
-use Invoiceninja\Einvoice\Decoder\Schema;
+use InvoiceNinja\EInvoice\Decoder\Schema;
class StaticController extends BaseController
{
@@ -62,7 +62,7 @@ class StaticController extends BaseController
if(request()->has('einvoice')){
$schema = new Schema();
- $response_data['einvoice_schema'] = $schema('FACT1');
+ $response_data['einvoice_schema'] = $schema('Peppol');
}
diff --git a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php
index 0e75760a6612..961fcb52ca68 100644
--- a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php
+++ b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php
@@ -67,7 +67,7 @@ class UpdateInvoiceRequest extends Request
$rules['client_id'] = ['bail', 'sometimes', Rule::in([$this->invoice->client_id])];
$rules['line_items'] = 'array';
-$rules['discount'] = 'sometimes|numeric|max:99999999999999';
+ $rules['discount'] = 'sometimes|numeric|max:99999999999999';
$rules['project_id'] = ['bail', 'sometimes', new ValidProjectForClient($this->all())];
$rules['tax_rate1'] = 'bail|sometimes|numeric';
$rules['tax_rate2'] = 'bail|sometimes|numeric';
@@ -80,7 +80,7 @@ $rules['discount'] = 'sometimes|numeric|max:99999999999999';
$rules['partial'] = 'bail|sometimes|nullable|numeric';
$rules['amount'] = ['sometimes', 'bail', 'numeric', 'max:99999999999999'];
-$rules['date'] = 'bail|sometimes|date:Y-m-d';
+ $rules['date'] = 'bail|sometimes|date:Y-m-d';
// $rules['partial_due_date'] = ['bail', 'sometimes', 'exclude_if:partial,0', Rule::requiredIf(fn () => $this->partial > 0), 'date', 'before:due_date'];
// $rules['due_date'] = ['bail', 'sometimes', 'nullable', 'after:partial_due_date', Rule::requiredIf(fn () => strlen($this->partial_due_date) > 1), 'date'];
diff --git a/app/Http/ValidationRules/Invoice/LockedInvoiceRule.php b/app/Http/ValidationRules/Invoice/LockedInvoiceRule.php
index e6aa6d445216..169df7757f15 100644
--- a/app/Http/ValidationRules/Invoice/LockedInvoiceRule.php
+++ b/app/Http/ValidationRules/Invoice/LockedInvoiceRule.php
@@ -16,6 +16,7 @@ use Illuminate\Contracts\Validation\Rule;
/**
* Class LockedInvoiceRule.
+ * @deprecated
*/
class LockedInvoiceRule implements Rule
{
@@ -67,6 +68,13 @@ class LockedInvoiceRule implements Rule
}
return true;
+
+ //if now is greater than the end of month the invoice was dated - do not modify
+ case 'end_of_month':
+ if(\Carbon\Carbon::parse($this->invoice->date)->setTimezone($this->invoice->company->timezone()->name)->endOfMonth()->lte(now()))
+ return false;
+
+ return true;
default:
return true;
}
diff --git a/app/Import/Definitions/ProductMap.php b/app/Import/Definitions/ProductMap.php
index e8247300ee0a..5f4e636ad12c 100644
--- a/app/Import/Definitions/ProductMap.php
+++ b/app/Import/Definitions/ProductMap.php
@@ -31,6 +31,7 @@ class ProductMap
12 => 'product.custom_value2',
13 => 'product.custom_value3',
14 => 'product.custom_value4',
+ 15 => 'product.image_url'
];
}
@@ -52,6 +53,7 @@ class ProductMap
12 => 'texts.custom_value',
13 => 'texts.custom_value',
14 => 'texts.custom_value',
+ 15 => 'texts.image_url',
];
}
}
diff --git a/app/Import/Transformer/Csv/ProductTransformer.php b/app/Import/Transformer/Csv/ProductTransformer.php
index 1c0c082dac7b..a1829df41912 100644
--- a/app/Import/Transformer/Csv/ProductTransformer.php
+++ b/app/Import/Transformer/Csv/ProductTransformer.php
@@ -42,6 +42,7 @@ class ProductTransformer extends BaseTransformer
'custom_value2' => $this->getString($data, 'product.custom_value2'),
'custom_value3' => $this->getString($data, 'product.custom_value3'),
'custom_value4' => $this->getString($data, 'product.custom_value4'),
+ 'product_image' => $this->getString($data, 'product.image_url'),
];
}
}
diff --git a/app/Import/Transformer/Csv/QuoteTransformer.php b/app/Import/Transformer/Csv/QuoteTransformer.php
index 1ee131f390cd..00c2cb54d952 100644
--- a/app/Import/Transformer/Csv/QuoteTransformer.php
+++ b/app/Import/Transformer/Csv/QuoteTransformer.php
@@ -94,7 +94,7 @@ class QuoteTransformer extends BaseTransformer
),
'footer' => $this->getString($quote_data, 'quote.footer'),
'partial' => $this->getFloat($quote_data, 'quote.partial'),
- 'partial_due_date' => isset($invoice_data['quote.partial_due_date']) ? $this->parseDate($quote_data['quote.partial_due_date']) : null,
+ 'partial_due_date' => isset($quote_data['quote.partial_due_date']) ? $this->parseDate($quote_data['quote.partial_due_date']) : null,
'custom_surcharge1' => $this->getString(
$quote_data,
'quote.custom_surcharge1'
diff --git a/app/Jobs/Cron/SubscriptionCron.php b/app/Jobs/Cron/SubscriptionCron.php
index 82b54d48ee8e..e9d0d32b4838 100644
--- a/app/Jobs/Cron/SubscriptionCron.php
+++ b/app/Jobs/Cron/SubscriptionCron.php
@@ -79,6 +79,7 @@ class SubscriptionCron
->cursor()
->each(function ($company_id){
+ /** @var \App\Models\Company $company */
$company = Company::find($company_id);
$timezone_now = now()->setTimezone($company->timezone()->name ?? 'Pacific/Midway');
diff --git a/app/Jobs/Mail/NinjaMailerJob.php b/app/Jobs/Mail/NinjaMailerJob.php
index 595e6fb8ace1..841f6207fc80 100644
--- a/app/Jobs/Mail/NinjaMailerJob.php
+++ b/app/Jobs/Mail/NinjaMailerJob.php
@@ -168,11 +168,6 @@ class NinjaMailerJob implements ShouldQueue
$this->logMailError($e->getMessage(), $this->company->clients()->first());
return;
}
- catch(\Symfony\Component\Mailer\Transport\Dsn $e){
- nlog("Incorrectly configured mail server - setting to default mail driver.");
- $this->nmo->settings->email_sending_method = 'default';
- return $this->setMailDriver();
- }
catch(\Google\Service\Exception $e){
if ($e->getCode() == '429') {
@@ -194,7 +189,7 @@ class NinjaMailerJob implements ShouldQueue
* this merges a text string with a json object
* need to harvest the ->Message property using the following
*/
- if (stripos($e->getMessage(), 'code 300') || stripos($e->getMessage(), 'code 413')) {
+ if (stripos($e->getMessage(), 'code 300') !== false || stripos($e->getMessage(), 'code 413') !== false) {
$message = "Either Attachment too large, or recipient has been suppressed.";
$this->fail();
@@ -209,7 +204,15 @@ class NinjaMailerJob implements ShouldQueue
return;
}
- if (stripos($e->getMessage(), 'code 406')) {
+ if(stripos($e->getMessage(), 'Dsn') !== false){
+
+ nlog("Incorrectly configured mail server - setting to default mail driver.");
+ $this->nmo->settings->email_sending_method = 'default';
+ return $this->setMailDriver();
+
+ }
+
+ if (stripos($e->getMessage(), 'code 406') !== false) {
$email = $this->nmo->to_user->email ?? '';
@@ -386,17 +389,17 @@ class NinjaMailerJob implements ShouldQueue
$company = $this->company;
- $smtp_host = $company->smtp_host;
+ $smtp_host = $company->smtp_host ?? '';
$smtp_port = $company->smtp_port;
- $smtp_username = $company->smtp_username;
- $smtp_password = $company->smtp_password;
+ $smtp_username = $company->smtp_username ?? '';
+ $smtp_password = $company->smtp_password ?? '';
$smtp_encryption = $company->smtp_encryption ?? 'tls';
$smtp_local_domain = strlen($company->smtp_local_domain) > 2 ? $company->smtp_local_domain : null;
$smtp_verify_peer = $company->smtp_verify_peer ?? true;
- if(strlen($smtp_host ?? '') <= 1 ||
- strlen($smtp_username ?? '') <= 1 ||
- strlen($smtp_password ?? '') <= 1
+ if(strlen($smtp_host) <= 1 ||
+ strlen($smtp_username) <= 1 ||
+ strlen($smtp_password) <= 1
)
{
$this->nmo->settings->email_sending_method = 'default';
@@ -790,6 +793,7 @@ class NinjaMailerJob implements ShouldQueue
private function refreshOfficeToken(User $user)
{
$expiry = $user->oauth_user_token_expiry ?: now()->subDay();
+ $token = false;
if ($expiry->lt(now())) {
$guzzle = new \GuzzleHttp\Client();
@@ -798,7 +802,7 @@ class NinjaMailerJob implements ShouldQueue
if (!$user->oauth_user_refresh_token || $user->oauth_user_refresh_token == '') {
return false;
}
-
+
try {
$token = json_decode($guzzle->post($url, [
'form_params' => [
diff --git a/app/Jobs/Mail/NinjaMailerObject.php b/app/Jobs/Mail/NinjaMailerObject.php
index d330a89e7bea..f00cbbbdf517 100644
--- a/app/Jobs/Mail/NinjaMailerObject.php
+++ b/app/Jobs/Mail/NinjaMailerObject.php
@@ -38,7 +38,7 @@ class NinjaMailerObject
public $template = false;
- /* @var bool | App\Models\Invoice | App\Models\Quote | App\Models\Credit | App\Models\RecurringInvoice | App\Models\PurchaseOrder | App\Models\Payment $entity */
+ /* @var \bool | App\Models\Invoice | App\Models\Quote | App\Models\Credit | App\Models\RecurringInvoice | App\Models\PurchaseOrder | App\Models\Payment $entity */
public $entity = false;
public $reminder_template = '';
diff --git a/app/Jobs/Util/ReminderJob.php b/app/Jobs/Util/ReminderJob.php
index f5f0a7ef871b..86be2d258cb7 100644
--- a/app/Jobs/Util/ReminderJob.php
+++ b/app/Jobs/Util/ReminderJob.php
@@ -168,46 +168,51 @@ class ReminderJob implements ShouldQueue
$amount = $fees[0];
$percent = $fees[1];
- $temp_invoice_balance = $over_due_invoice->balance;
+ $invoice = false;
- if ($amount <= 0 && $percent <= 0) {
- return;
+ //2024-06-07 this early return prevented any reminders from sending for users who enabled lock_invoices.
+ if ($amount > 0 || $percent > 0) {
+ // return;
+
+ $fee = $amount;
+
+ if ($over_due_invoice->partial > 0) {
+ $fee += round($over_due_invoice->partial * $percent / 100, 2);
+ } else {
+ $fee += round($over_due_invoice->balance * $percent / 100, 2);
+ }
+
+ /** @var \App\Models\Invoice $invoice */
+ $invoice = InvoiceFactory::create($over_due_invoice->company_id, $over_due_invoice->user_id);
+ $invoice->client_id = $over_due_invoice->client_id;
+ $invoice->date = now()->format('Y-m-d');
+ $invoice->due_date = now()->format('Y-m-d');
+
+ $invoice_item = new InvoiceItem();
+ $invoice_item->type_id = '5';
+ $invoice_item->product_key = trans('texts.fee');
+ $invoice_item->notes = ctrans('texts.late_fee_added_locked_invoice', ['invoice' => $over_due_invoice->number, 'date' => $this->translateDate(now()->startOfDay(), $over_due_invoice->client->date_format(), $over_due_invoice->client->locale())]);
+ $invoice_item->quantity = 1;
+ $invoice_item->cost = $fee;
+
+ $invoice_items = [];
+ $invoice_items[] = $invoice_item;
+
+ $invoice->line_items = $invoice_items;
+
+ /**Refresh Invoice values*/
+ $invoice = $invoice->calc()->getInvoice();
+ $invoice->service()
+ ->createInvitations()
+ ->applyNumber()
+ ->markSent()
+ ->save();
}
- $fee = $amount;
-
- if ($over_due_invoice->partial > 0) {
- $fee += round($over_due_invoice->partial * $percent / 100, 2);
- } else {
- $fee += round($over_due_invoice->balance * $percent / 100, 2);
+ if(!$invoice){
+ $invoice = $over_due_invoice;
}
- /** @var \App\Models\Invoice $invoice */
- $invoice = InvoiceFactory::create($over_due_invoice->company_id, $over_due_invoice->user_id);
- $invoice->client_id = $over_due_invoice->client_id;
- $invoice->date = now()->format('Y-m-d');
- $invoice->due_date = now()->format('Y-m-d');
-
- $invoice_item = new InvoiceItem();
- $invoice_item->type_id = '5';
- $invoice_item->product_key = trans('texts.fee');
- $invoice_item->notes = ctrans('texts.late_fee_added_locked_invoice', ['invoice' => $over_due_invoice->number, 'date' => $this->translateDate(now()->startOfDay(), $over_due_invoice->client->date_format(), $over_due_invoice->client->locale())]);
- $invoice_item->quantity = 1;
- $invoice_item->cost = $fee;
-
- $invoice_items = [];
- $invoice_items[] = $invoice_item;
-
- $invoice->line_items = $invoice_items;
-
- /**Refresh Invoice values*/
- $invoice = $invoice->calc()->getInvoice();
- $invoice->service()
- ->createInvitations()
- ->applyNumber()
- ->markSent()
- ->save();
-
$enabled_reminder = 'enable_'.$reminder_template;
if ($reminder_template == 'endless_reminder') {
$enabled_reminder = 'enable_reminder_endless';
diff --git a/app/Livewire/BillingPortal/RFF.php b/app/Livewire/BillingPortal/RFF.php
index 38b36f868108..30ce571869a0 100644
--- a/app/Livewire/BillingPortal/RFF.php
+++ b/app/Livewire/BillingPortal/RFF.php
@@ -45,6 +45,7 @@ class RFF extends Component
$contact = auth()->guard('contact');
+ /** @var \App\Models\ClientContact $contact */
$contact->user()->update([
'first_name' => $data['contact_first_name'],
'last_name' => $data['contact_last_name'],
@@ -65,6 +66,7 @@ class RFF extends Component
public function render()
{
+ /** @var \App\Models\CompanyGateway $gateway */
$gateway = CompanyGateway::find($this->context['form']['company_gateway_id']);
$countries = Cache::get('countries');
diff --git a/app/Livewire/RequiredClientInfo.php b/app/Livewire/RequiredClientInfo.php
index 361338b33a90..3ff7d5374bba 100644
--- a/app/Livewire/RequiredClientInfo.php
+++ b/app/Livewire/RequiredClientInfo.php
@@ -402,7 +402,7 @@ class RequiredClientInfo extends Component
if ($this->unfilled_fields === 0 && (!$this->company_gateway->always_show_required_fields || $this->is_subscription)) {
$this->dispatch(
'passed-required-fields-check',
- client_postal_code: $this->contact->client->postal_code
+ client_postal_code: $_contact->client->postal_code
);
}
diff --git a/app/Models/Client.php b/app/Models/Client.php
index aa054d06f3df..b48973655050 100644
--- a/app/Models/Client.php
+++ b/app/Models/Client.php
@@ -386,6 +386,7 @@ class Client extends BaseModel implements HasLocalePreference
// }
return $languages->first(function ($item) {
+ /** @var \stdClass $item */
return $item->id == $this->getSetting('language_id');
});
}
@@ -419,6 +420,8 @@ class Client extends BaseModel implements HasLocalePreference
// }
return $date_formats->first(function ($item) {
+
+ /** @var \stdClass $item */
return $item->id == $this->getSetting('date_format_id');
})->format;
}
@@ -433,6 +436,8 @@ class Client extends BaseModel implements HasLocalePreference
// }
return $currencies->first(function ($item) {
+
+ /** @var \stdClass $item */
return $item->id == $this->getSetting('currency_id');
});
}
diff --git a/app/Models/Company.php b/app/Models/Company.php
index e83c465cef79..815b21aa8ffc 100644
--- a/app/Models/Company.php
+++ b/app/Models/Company.php
@@ -636,17 +636,21 @@ class Company extends BaseModel
public function country()
{
- $companies = Cache::get('countries');
+ $countries = app('countries');
- if (! $companies) {
- $this->buildCache(true);
+ // $countries = Cache::get('countries');
- $companies = Cache::get('countries');
- }
+ // if (! $companies) {
+ // $this->buildCache(true);
- return $companies->filter(function ($item) {
+ // $companies = Cache::get('countries');
+ // }
+
+ return $countries->first(function ($item) {
+
+ /** @var \stdClass $item */
return $item->id == $this->getSetting('country_id');
- })->first();
+ });
// return $this->belongsTo(Country::class);
// return Country::find($this->settings->country_id);
@@ -659,15 +663,18 @@ class Company extends BaseModel
public function timezone()
{
- $timezones = Cache::get('timezones');
+ // $timezones = Cache::get('timezones');
- if (! $timezones) {
- $this->buildCache(true);
- }
+ $timezones = app('timezones');
- return $timezones->filter(function ($item) {
+ // if (! $timezones) {
+ // $this->buildCache(true);
+ // }
+
+ return $timezones->first(function ($item) {
+ /** @var \stdClass $item */
return $item->id == $this->settings->timezone_id;
- })->first();
+ });
// return Timezone::find($this->settings->timezone_id);
}
diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php
index 135f420ed8f5..70dfd979a814 100644
--- a/app/Models/Invoice.php
+++ b/app/Models/Invoice.php
@@ -563,6 +563,8 @@ class Invoice extends BaseModel
return $this->status_id == self::STATUS_SENT;
case 'when_paid':
return $this->status_id == self::STATUS_PAID || $this->status_id == self::STATUS_PARTIAL;
+ case 'end_of_month':
+ return \Carbon\Carbon::parse($this->date)->setTimezone($this->company->timezone()->name)->endOfMonth()->lte(now());
default:
return false;
}
diff --git a/app/PaymentDrivers/BTCPayPaymentDriver.php b/app/PaymentDrivers/BTCPayPaymentDriver.php
index 368f5b7beb0b..e7560cec2784 100644
--- a/app/PaymentDrivers/BTCPayPaymentDriver.php
+++ b/app/PaymentDrivers/BTCPayPaymentDriver.php
@@ -87,7 +87,8 @@ class BTCPayPaymentDriver extends BaseDriver
public function processWebhookRequest()
{
$webhook_payload = file_get_contents('php://input');
-
+ $sig = false;
+ /** @var \stdClass $btcpayRep */
$btcpayRep = json_decode($webhook_payload);
if ($btcpayRep == null) {
throw new PaymentFailed('Empty data');
diff --git a/app/PaymentDrivers/PayPal/PayPalBasePaymentDriver.php b/app/PaymentDrivers/PayPal/PayPalBasePaymentDriver.php
index b2f5ea5bf36c..dc5f845a0c76 100644
--- a/app/PaymentDrivers/PayPal/PayPalBasePaymentDriver.php
+++ b/app/PaymentDrivers/PayPal/PayPalBasePaymentDriver.php
@@ -176,6 +176,27 @@ class PayPalBasePaymentDriver extends BaseDriver
}
+ public function handleDuplicateInvoiceId(string $orderID)
+ {
+
+ $_invoice = collect($this->payment_hash->data->invoices)->first();
+ $invoice = Invoice::withTrashed()->find($this->decodePrimaryKey($_invoice->invoice_id));
+ $new_invoice_number = $invoice->number."_".Str::random(5);
+
+ $update_data =
+ [[
+ "op" => "replace",
+ "path" => "/purchase_units/@reference_id=='default'/invoice_id",
+ "value" => $new_invoice_number,
+ ]];
+
+ $r = $this->gatewayRequest("/v2/checkout/orders/{$orderID}", 'patch', $update_data);
+
+ $r = $this->gatewayRequest("/v2/checkout/orders/{$orderID}/capture", 'post', ['body' => '']);
+
+ return $r;
+ }
+
public function getShippingAddress(): ?array
{
return $this->company_gateway->require_shipping_address ?
@@ -369,13 +390,30 @@ class PayPalBasePaymentDriver extends BaseDriver
}
+ public function handleProcessingFailure(array $response)
+ {
+
+ SystemLogger::dispatch(
+ ['response' => $response],
+ SystemLog::CATEGORY_GATEWAY_RESPONSE,
+ SystemLog::EVENT_GATEWAY_FAILURE,
+ SystemLog::TYPE_PAYPAL,
+ $this->client,
+ $this->client->company ?? $this->company_gateway->company,
+ );
+
+ switch ($response['name']) {
+ case 'NOT_AUTHORIZED':
+ throw new PaymentFailed("There was a permissions issue processing this payment, please contact the merchant. ", 401);
+ break;
+
+ default:
+ throw new PaymentFailed("Unknown error occurred processing payment. Please contact merchant.", 500);
+ break;
+ }
+ }
+
public function handleRetry($response, $request) {
-
- // $response = $r->json();
- // nlog($response['details']);
-
- // if(in_array($response['details'][0]['issue'], ['INSTRUMENT_DECLINED', 'PAYER_ACTION_REQUIRED']))
-
return response()->json($response->json());
}
diff --git a/app/PaymentDrivers/PayPalPPCPPaymentDriver.php b/app/PaymentDrivers/PayPalPPCPPaymentDriver.php
index 47141b678dfa..ab9cc5932027 100644
--- a/app/PaymentDrivers/PayPalPPCPPaymentDriver.php
+++ b/app/PaymentDrivers/PayPalPPCPPaymentDriver.php
@@ -114,15 +114,19 @@ class PayPalPPCPPaymentDriver extends PayPalBasePaymentDriver
public function processPaymentResponse($request)
{
+ nlog("response");
+
$request['gateway_response'] = str_replace("Error: ", "", $request['gateway_response']);
$response = json_decode($request['gateway_response'], true);
+ nlog($response);
+
if($request->has('token') && strlen($request->input('token')) > 2) {
return $this->processTokenPayment($request, $response);
}
//capture
- $orderID = $response['orderID'];
+ $orderID = $response['orderID'] ?? $this->payment_hash->data->orderID;
if($this->company_gateway->require_shipping_address) {
@@ -149,36 +153,26 @@ class PayPalPPCPPaymentDriver extends PayPalBasePaymentDriver
if($r->status() == 422) {
//handle conditions where the client may need to try again.
- return $this->handleRetry($r, $request);
+ // return $this->handleRetry($r, $request);
+
+ $r = $this->handleDuplicateInvoiceId($orderID);
+
}
} catch(\Exception $e) {
//Rescue for duplicate invoice_id
if(stripos($e->getMessage(), 'DUPLICATE_INVOICE_ID') !== false) {
-
-
- $_invoice = collect($this->payment_hash->data->invoices)->first();
- $invoice = Invoice::withTrashed()->find($this->decodePrimaryKey($_invoice->invoice_id));
- $new_invoice_number = $invoice->number."_".Str::random(5);
-
- $update_data =
- [[
- "op" => "replace",
- "path" => "/purchase_units/@reference_id=='default'/invoice_id",
- "value" => $new_invoice_number,
- ]];
-
- $r = $this->gatewayRequest("/v2/checkout/orders/{$orderID}", 'patch', $update_data);
-
- $r = $this->gatewayRequest("/v2/checkout/orders/{$orderID}/capture", 'post', ['body' => '']);
-
+ $r = $this->handleDuplicateInvoiceId($orderID);
}
}
$response = $r;
+ nlog("Process response =>");
+ nlog($response->json());
+
if(isset($response['status']) && $response['status'] == 'COMPLETED' && isset($response['purchase_units'])) {
$data = [
@@ -222,7 +216,6 @@ class PayPalPPCPPaymentDriver extends PayPalBasePaymentDriver
return response()->json(['message' => $message], 400);
- // throw new PaymentFailed($message, 400);
}
}
@@ -303,6 +296,8 @@ class PayPalPPCPPaymentDriver extends PayPalBasePaymentDriver
$r = $this->gatewayRequest('/v2/checkout/orders', 'post', $order);
+ $this->payment_hash->withData("orderID", $r->json()['id']);
+
return $r->json()['id'];
}
diff --git a/app/PaymentDrivers/PayPalRestPaymentDriver.php b/app/PaymentDrivers/PayPalRestPaymentDriver.php
index 5e19429d6ff2..f9e6725aae3d 100644
--- a/app/PaymentDrivers/PayPalRestPaymentDriver.php
+++ b/app/PaymentDrivers/PayPalRestPaymentDriver.php
@@ -60,7 +60,7 @@ class PayPalRestPaymentDriver extends PayPalBasePaymentDriver
*/
public function processPaymentResponse($request)
{
-
+ nlog("response");
$this->init();
$request['gateway_response'] = str_replace("Error: ", "", $request['gateway_response']);
@@ -72,7 +72,8 @@ class PayPalRestPaymentDriver extends PayPalBasePaymentDriver
return $this->processTokenPayment($request, $response);
//capture
- $orderID = $response['orderID'];
+
+ $orderID = $response['orderID'] ?? $this->payment_hash->data->orderID;
if($this->company_gateway->require_shipping_address) {
@@ -100,7 +101,10 @@ class PayPalRestPaymentDriver extends PayPalBasePaymentDriver
if($r->status() == 422){
//handle conditions where the client may need to try again.
- return $this->handleRetry($r, $request);
+
+ $r = $this->handleDuplicateInvoiceId($orderID);
+
+
}
}
@@ -109,21 +113,8 @@ class PayPalRestPaymentDriver extends PayPalBasePaymentDriver
//Rescue for duplicate invoice_id
if(stripos($e->getMessage(), 'DUPLICATE_INVOICE_ID') !== false){
-
- $_invoice = collect($this->payment_hash->data->invoices)->first();
- $invoice = Invoice::withTrashed()->find($this->decodePrimaryKey($_invoice->invoice_id));
- $new_invoice_number = $invoice->number."_".Str::random(5);
-
- $update_data =
- [[
- "op" => "replace",
- "path" => "/purchase_units/@reference_id=='default'/invoice_id",
- "value" => $new_invoice_number,
- ]];
-
- $r = $this->gatewayRequest("/v2/checkout/orders/{$orderID}", 'patch', $update_data);
-
- $r = $this->gatewayRequest("/v2/checkout/orders/{$orderID}/capture", 'post', ['body' => '']);
+
+ $r = $this->handleDuplicateInvoiceId($orderID);
}
@@ -157,11 +148,12 @@ class PayPalRestPaymentDriver extends PayPalBasePaymentDriver
return response()->json(['message' => $message], 400);
- //throw new PaymentFailed($message, 400);
}
}
+
+
private function createNinjaPayment($request, $response) {
$data = [
@@ -273,10 +265,19 @@ class PayPalRestPaymentDriver extends PayPalBasePaymentDriver
$r = $this->gatewayRequest('/v2/checkout/orders', 'post', $order);
nlog($r->json());
- return $r->json()['id'];
+ $response = $r->json();
+
+ if(!isset($response['id']))
+ $this->handleProcessingFailure($response);
+
+ $this->payment_hash->withData("orderID", $response['id']);
+
+ return $response['id'];
}
+
+
/**
* processTokenPayment
*
@@ -293,6 +294,7 @@ class PayPalRestPaymentDriver extends PayPalBasePaymentDriver
*/
public function processTokenPayment($request, array $response) {
+ /** @car \App\Models\ClientGatwayToken $cgt */
$cgt = ClientGatewayToken::where('client_id', $this->client->id)
->where('token', $request['token'])
->firstOrFail();
diff --git a/app/PaymentDrivers/WePayPaymentDriver.php b/app/PaymentDrivers/WePayPaymentDriver.php
index 2cd93f7905de..4d1cb96e1766 100644
--- a/app/PaymentDrivers/WePayPaymentDriver.php
+++ b/app/PaymentDrivers/WePayPaymentDriver.php
@@ -161,9 +161,9 @@ class WePayPaymentDriver extends BaseDriver
}
- public function detach(ClientGatewayToken $token)
+ public function detach(ClientGatewayToken $token): bool
{
-
+ return true;
}
public function getClientRequiredFields(): array
diff --git a/app/Services/EDocument/Standards/FatturaPANew.php b/app/Services/EDocument/Standards/FatturaPANew.php
index 870021d08ddd..6cdb87549b52 100644
--- a/app/Services/EDocument/Standards/FatturaPANew.php
+++ b/app/Services/EDocument/Standards/FatturaPANew.php
@@ -13,24 +13,24 @@ namespace App\Services\EDocument\Standards;
use App\Models\Invoice;
use App\Services\AbstractService;
-use Invoiceninja\Einvoice\Models\FatturaPA\FatturaElettronica;
-use Invoiceninja\Einvoice\Models\FatturaPA\IndirizzoType\Sede;
-use Invoiceninja\Einvoice\Models\FatturaPA\AnagraficaType\Anagrafica;
-use Invoiceninja\Einvoice\Models\FatturaPA\IdFiscaleType\IdFiscaleIVA;
-use Invoiceninja\Einvoice\Models\FatturaPA\IdFiscaleType\IdTrasmittente;
-use Invoiceninja\Einvoice\Models\FatturaPA\DatiGeneraliType\DatiGenerali;
-use Invoiceninja\Einvoice\Models\FatturaPA\DatiPagamentoType\DatiPagamento;
-use Invoiceninja\Einvoice\Models\FatturaPA\DatiRiepilogoType\DatiRiepilogo;
-use Invoiceninja\Einvoice\Models\FatturaPA\DettaglioLineeType\DettaglioLinee;
-use Invoiceninja\Einvoice\Models\FatturaPA\DatiBeniServiziType\DatiBeniServizi;
-use Invoiceninja\Einvoice\Models\FatturaPA\DatiTrasmissioneType\DatiTrasmissione;
-use Invoiceninja\Einvoice\Models\FatturaPA\CedentePrestatoreType\CedentePrestatore;
-use Invoiceninja\Einvoice\Models\FatturaPA\DatiAnagraficiCedenteType\DatiAnagrafici;
-use Invoiceninja\Einvoice\Models\FatturaPA\DettaglioPagamentoType\DettaglioPagamento;
-use Invoiceninja\Einvoice\Models\FatturaPA\DatiGeneraliDocumentoType\DatiGeneraliDocumento;
-use Invoiceninja\Einvoice\Models\FatturaPA\CessionarioCommittenteType\CessionarioCommittente;
-use Invoiceninja\Einvoice\Models\FatturaPA\FatturaElettronicaBodyType\FatturaElettronicaBody;
-use Invoiceninja\Einvoice\Models\FatturaPA\FatturaElettronicaHeaderType\FatturaElettronicaHeader;
+use InvoiceNinja\EInvoice\Models\FatturaPA\FatturaElettronica;
+use InvoiceNinja\EInvoice\Models\FatturaPA\IndirizzoType\Sede;
+use InvoiceNinja\EInvoice\Models\FatturaPA\AnagraficaType\Anagrafica;
+use InvoiceNinja\EInvoice\Models\FatturaPA\IdFiscaleType\IdFiscaleIVA;
+use InvoiceNinja\EInvoice\Models\FatturaPA\IdFiscaleType\IdTrasmittente;
+use InvoiceNinja\EInvoice\Models\FatturaPA\DatiGeneraliType\DatiGenerali;
+use InvoiceNinja\EInvoice\Models\FatturaPA\DatiPagamentoType\DatiPagamento;
+use InvoiceNinja\EInvoice\Models\FatturaPA\DatiRiepilogoType\DatiRiepilogo;
+use InvoiceNinja\EInvoice\Models\FatturaPA\DettaglioLineeType\DettaglioLinee;
+use InvoiceNinja\EInvoice\Models\FatturaPA\DatiBeniServiziType\DatiBeniServizi;
+use InvoiceNinja\EInvoice\Models\FatturaPA\DatiTrasmissioneType\DatiTrasmissione;
+use InvoiceNinja\EInvoice\Models\FatturaPA\CedentePrestatoreType\CedentePrestatore;
+use InvoiceNinja\EInvoice\Models\FatturaPA\DatiAnagraficiCedenteType\DatiAnagrafici;
+use InvoiceNinja\EInvoice\Models\FatturaPA\DettaglioPagamentoType\DettaglioPagamento;
+use InvoiceNinja\EInvoice\Models\FatturaPA\DatiGeneraliDocumentoType\DatiGeneraliDocumento;
+use InvoiceNinja\EInvoice\Models\FatturaPA\CessionarioCommittenteType\CessionarioCommittente;
+use InvoiceNinja\EInvoice\Models\FatturaPA\FatturaElettronicaBodyType\FatturaElettronicaBody;
+use InvoiceNinja\EInvoice\Models\FatturaPA\FatturaElettronicaHeaderType\FatturaElettronicaHeader;
class FatturaPANew extends AbstractService
{
@@ -178,7 +178,7 @@ class FatturaPANew extends AbstractService
$this->DatiGeneraliDocumento->Divisa = $this->invoice->client->currency()->code;
$this->DatiGeneraliDocumento->Data = new \DateTime($this->invoice->date);
$this->DatiGeneraliDocumento->Numero = $this->invoice->number;
- $this->DatiGeneraliDocumento->Causale[] = substr($this->invoice->public_notes ?? '',0, 200); //unsure..
+ $this->DatiGeneraliDocumento->Causale[] = substr($this->invoice->public_notes ?? ' ', 0, 200); //unsure..
return $this;
}
diff --git a/app/Services/EDocument/Standards/OrderXDocument.php b/app/Services/EDocument/Standards/OrderXDocument.php
index 71349db49595..63b63a901e4a 100644
--- a/app/Services/EDocument/Standards/OrderXDocument.php
+++ b/app/Services/EDocument/Standards/OrderXDocument.php
@@ -26,14 +26,17 @@ class OrderXDocument extends AbstractService
{
public OrderDocumentBuilder $orderxdocument;
- public function __construct(public object $document, private readonly bool $returnObject = false, private array $tax_map = [])
+ /** @var \App\Models\Invoice | \App\Models\Quote | \App\Models\PurchaseOrder | \App\Models\Credit $document */
+
+ public function __construct(public mixed $document, private readonly bool $returnObject = false, private array $tax_map = [])
{
}
public function run(): self
{
-
+
$company = $this->document->company;
+ /** @var \App\Models\Client | \App\Models\Vendor $settings_entity */
$settings_entity = ($this->document instanceof PurchaseOrder) ? $this->document->vendor : $this->document->client;
$profile = $settings_entity->getSetting('e_quote_type') ? $settings_entity->getSetting('e_quote_type') : "OrderX_Extended";
diff --git a/app/Services/EDocument/Standards/Peppol.php b/app/Services/EDocument/Standards/Peppol.php
new file mode 100644
index 000000000000..93cd1c5be5bb
--- /dev/null
+++ b/app/Services/EDocument/Standards/Peppol.php
@@ -0,0 +1,518 @@
+ "Commercial invoice",
+ "381" => "Credit note",
+ "383" => "Corrected invoice",
+ "384" => "Prepayment invoice",
+ "386" => "Proforma invoice",
+ "875" => "Self-billed invoice",
+ "976" => "Factored invoice",
+ "84" => "Invoice for cross border services",
+ "82" => "Simplified invoice",
+ "80" => "Debit note",
+ "875" => "Self-billed credit note",
+ "896" => "Debit note related to self-billed invoice"
+ ];
+
+ private \InvoiceNinja\EInvoice\Models\Peppol\Invoice $p_invoice;
+
+ private InvoiceSum | InvoiceSumInclusive $calc;
+
+ /**
+ * @param Invoice $invoice
+ */
+ public function __construct(public Invoice $invoice)
+ {
+ $this->p_invoice = new \InvoiceNinja\EInvoice\Models\Peppol\Invoice;
+ $this->calc = $this->invoice->calc();
+ }
+
+ public function getInvoice(): \InvoiceNinja\EInvoice\Models\Peppol\Invoice
+ {
+ return $this->p_invoice;
+
+ }
+
+ public function run()
+ {
+ $this->p_invoice->ID = $this->invoice->number;
+ $this->p_invoice->IssueDate = new \DateTime($this->invoice->date);
+ $this->p_invoice->InvoiceTypeCode = 380; //
+ $this->p_invoice->AccountingSupplierParty = $this->getAccountingSupplierParty();
+ $this->p_invoice->AccountingCustomerParty = $this->getAccountingCustomerParty();
+ $this->p_invoice->InvoiceLine = $this->getInvoiceLines();
+ $this->p_invoice->TaxTotal = $this->getTotalTaxes();
+ $this->p_invoice->LegalMonetaryTotal = $this->getLegalMonetaryTotal();
+
+// $payeeFinancialAccount = (new PayeeFinancialAccount())
+// ->setBankId($company->settings->custom_value1)
+// ->setBankName($company->settings->custom_value2);
+
+// $paymentMeans = (new PaymentMeans())
+// ->setPaymentMeansCode($invoice->custom_value1)
+// ->setPayeeFinancialAccount($payeeFinancialAccount);
+// $ubl_invoice->setPaymentMeans($paymentMeans);
+
+ }
+
+ private function getLegalMonetaryTotal(): LegalMonetaryTotal
+ {
+ $taxable = $this->getTaxable();
+
+ $lmt = new LegalMonetaryTotal;
+
+ $lea = new LineExtensionAmount;
+ $lea->currencyID = $this->invoice->client->currency()->code;
+ $lea->amount = $taxable;
+ $lmt->LineExtensionAmount = $lea;
+
+ $tea = new TaxExclusiveAmount;
+ $tea->currencyID = $this->invoice->client->currency()->code;
+ $tea->amount = $taxable;
+ $lmt->TaxExclusiveAmount = $tea;
+
+ $tia = new TaxInclusiveAmount;
+ $tia->currencyID = $this->invoice->client->currency()->code;
+ $tia->amount = $this->invoice->amount;
+ $lmt->TaxInclusiveAmount = $tia;
+
+ $pa = new PayableAmount;
+ $pa->currencyID = $this->invoice->client->currency()->code;
+ $pa->amount = $this->invoice->amount;
+ $lmt->PayableAmount = $pa;
+
+ return $lmt;
+ }
+
+ private function getTotalTaxes(): array
+ {
+ $taxes = [];
+
+ $type_id = $this->invoice->line_items[0]->type_id;
+
+ if( strlen($this->invoice->tax_name1 ?? '') > 1)
+ {
+
+ $tax_amount = new TaxAmount();
+ $tax_amount->currencyID = $this->invoice->client->currency()->code;
+ $tax_amount->amount = round($this->invoice->amount * (1 / $this->invoice->tax_rate1),2);
+
+$tax_subtotal = new TaxSubtotal();
+$tax_subtotal->TaxAmount = $tax_amount;
+
+
+$taxable_amount = new TaxableAmount();
+$taxable_amount->currencyID = $this->invoice->client->currency()->code;
+$taxable_amount->amount = $this->invoice->amount;
+$tax_subtotal->TaxableAmount = $taxable_amount;
+
+
+
+ $tc = new TaxCategory();
+ $tc->ID = $type_id == '2' ? 'HUR' : 'C62';
+ $tc->Percent = $this->invoice->tax_rate1;
+ $ts = new PeppolTaxScheme();
+ $ts->ID = $this->invoice->tax_name1;
+ $tc->TaxScheme = $ts;
+ $tax_subtotal->TaxCategory = $tc;
+
+ $tax_total = new TaxTotal;
+ $tax_total->TaxAmount = $tax_amount;
+ $tax_total->TaxSubtotal = $tax_subtotal;
+
+ $taxes[] = $tax_total;
+ }
+
+
+ if(strlen($this->invoice->tax_name2 ?? '') > 1) {
+
+ $tax_amount = new TaxAmount();
+ $tax_amount->currencyID = $this->invoice->client->currency()->code;
+ $tax_amount->amount = round($this->invoice->amount * (1 / $this->invoice->tax_rate2), 2);
+
+$tax_subtotal = new TaxSubtotal();
+$tax_subtotal->TaxAmount = $tax_amount;
+
+$taxable_amount = new TaxableAmount();
+$taxable_amount->currencyID = $this->invoice->client->currency()->code;
+$taxable_amount->amount = $this->invoice->amount;
+$tax_subtotal->TaxableAmount = $taxable_amount;
+
+
+ $tc = new TaxCategory();
+ $tc->ID = $type_id == '2' ? 'HUR' : 'C62';
+ $tc->Percent = $this->invoice->tax_rate2;
+ $ts = new PeppolTaxScheme();
+ $ts->ID = $this->invoice->tax_name2;
+ $tc->TaxScheme = $ts;
+ $tax_subtotal->TaxCategory = $tc;
+
+
+ $tax_total = new TaxTotal();
+ $tax_total->TaxAmount = $tax_amount;
+ $tax_total->TaxSubtotal = $tax_subtotal;
+
+ $taxes[] = $tax_total;
+
+ }
+
+ if(strlen($this->invoice->tax_name3 ?? '') > 1) {
+
+ $tax_amount = new TaxAmount();
+ $tax_amount->currencyID = $this->invoice->client->currency()->code;
+ $tax_amount->amount = round($this->invoice->amount * (1 / $this->invoice->tax_rate1), 2);
+
+$tax_subtotal = new TaxSubtotal();
+$tax_subtotal->TaxAmount = $tax_amount;
+
+$taxable_amount = new TaxableAmount();
+$taxable_amount->currencyID = $this->invoice->client->currency()->code;
+$taxable_amount->amount = $this->invoice->amount;
+$tax_subtotal->TaxableAmount = $taxable_amount;
+
+
+ $tc = new TaxCategory();
+ $tc->ID = $type_id == '2' ? 'HUR' : 'C62';
+ $tc->Percent = $this->invoice->tax_rate3;
+ $ts = new PeppolTaxScheme();
+ $ts->ID = $this->invoice->tax_name3;
+ $tc->TaxScheme = $ts;
+ $tax_subtotal->TaxCategory = $tc;
+
+
+ $tax_total = new TaxTotal();
+ $tax_total->TaxAmount = $tax_amount;
+ $tax_total->TaxSubtotal = $tax_subtotal;
+
+ $taxes[] = $tax_total;
+
+ }
+
+
+ return $taxes;
+ }
+
+ private function getInvoiceLines(): array
+ {
+ $lines = [];
+
+ foreach($this->invoice->line_items as $key => $item)
+ {
+
+ $_item = new Item;
+ $_item->Name = $item->product_key;
+ $_item->Description = $item->notes;
+
+ $line = new InvoiceLine;
+ $line->ID = $key+1;
+ $line->InvoicedQuantity = $item->quantity;
+
+ $lea = new LineExtensionAmount;
+ $lea->currencyID = $this->invoice->client->currency()->code;
+ $lea->amount = $item->line_total;
+ $line->LineExtensionAmount = $lea;
+ $line->Item = $_item;
+
+ // $ta = new TaxAmount;
+ // $ta->amount = $this->getItemTaxes($item);
+ // $ta->currencyID = $this->invoice->client->currency()->Code;
+ // $tt->TaxAmount = $ta;
+ $item_taxes = $this->getItemTaxes($item);
+
+ if(count($item_taxes) > 0)
+ $line->TaxTotal = $item_taxes;
+
+ $price = new Price;
+ $pa = new PriceAmount;
+ $pa->currencyID = $this->invoice->client->currency()->code;
+ $pa->amount = $this->costWithDiscount($item);
+ $price->PriceAmount = $pa;
+
+ $line->Price = $price;
+
+ $lines[] = $line;
+ }
+
+ return $lines;
+ }
+
+ private function costWithDiscount($item)
+ {
+ $cost = $item->cost;
+
+ if ($item->discount != 0) {
+ if ($this->invoice->is_amount_discount) {
+ $cost -= $item->discount / $item->quantity;
+ } else {
+ $cost -= $cost * $item->discount / 100;
+ }
+ }
+
+ return $cost;
+ }
+
+ private function getItemTaxes(object $item): array
+ {
+ $item_taxes = [];
+
+ if(strlen($item->tax_name1 ?? '') > 1)
+ {
+
+ $tax_amount = new TaxAmount;
+ $tax_amount->currencyID = $this->invoice->client->currency()->code;
+ $tax_amount->amount = round(($item->line_total * (1/$item->tax_rate1)),2);
+ $tax_subtotal = new TaxSubtotal;
+ $tax_subtotal->TaxAmount = $tax_amount;
+
+ $taxable_amount = new TaxableAmount;
+ $taxable_amount->currencyID = $this->invoice->client->currency()->code;
+ $taxable_amount->amount = $item->line_total;
+ $tax_subtotal->TaxableAmount = $taxable_amount;
+ $tc = new TaxCategory;
+ $tc->ID = $item->type_id == '2' ? 'HUR' : 'C62';
+ $tc->Percent = $item->tax_rate1;
+ $ts = new PeppolTaxScheme;
+ $ts->ID = $item->tax_name1;
+ $tc->TaxScheme = $ts;
+ $tax_subtotal->TaxCategory = $tc;
+
+
+$tax_total = new TaxTotal();
+$tax_total->TaxAmount = $tax_amount;
+$tax_total->TaxSubtotal[] = $tax_subtotal;
+$item_taxes[] = $tax_total;
+
+ }
+
+
+ if(strlen($item->tax_name2 ?? '') > 1) {
+
+ $tax_amount = new TaxAmount();
+ $tax_amount->currencyID = $this->invoice->client->currency()->code;
+ $tax_amount->amount = round(($item->line_total * (1 / $item->tax_rate2)),2);
+
+$tax_subtotal = new TaxSubtotal();
+$tax_subtotal->TaxAmount = $tax_amount;
+
+$taxable_amount = new TaxableAmount();
+$taxable_amount->currencyID = $this->invoice->client->currency()->code;
+$taxable_amount->amount = $item->line_total;
+$tax_subtotal->TaxableAmount = $taxable_amount;
+
+
+ $tc = new TaxCategory();
+ $tc->ID = $item->type_id == '2' ? 'HUR' : 'C62';
+ $tc->Percent = $item->tax_rate2;
+ $ts = new PeppolTaxScheme();
+ $ts->ID = $item->tax_name2;
+ $tc->TaxScheme = $ts;
+ $tax_subtotal->TaxCategory = $tc;
+
+
+$tax_total = new TaxTotal();
+$tax_total->TaxAmount = $tax_amount;
+$tax_total->TaxSubtotal[] = $tax_subtotal;
+$item_taxes[] = $tax_total;
+
+
+ }
+
+
+ if(strlen($item->tax_name3 ?? '') > 1) {
+
+ $tax_amount = new TaxAmount();
+ $tax_amount->currencyID = $this->invoice->client->currency()->code;
+ $tax_amount->amount = round(($item->line_total * (1 / $item->tax_rate3)),2);
+
+$tax_subtotal = new TaxSubtotal();
+$tax_subtotal->TaxAmount = $tax_amount;
+
+$taxable_amount = new TaxableAmount();
+$taxable_amount->currencyID = $this->invoice->client->currency()->code;
+$taxable_amount->amount = $item->line_total;
+$tax_subtotal->TaxableAmount = $taxable_amount;
+
+
+ $tc = new TaxCategory();
+ $tc->ID = $item->type_id == '2' ? 'HUR' : 'C62';
+ $tc->Percent = $item->tax_rate3;
+ $ts = new PeppolTaxScheme();
+ $ts->ID = $item->tax_name3;
+ $tc->TaxScheme = $ts;
+ $tax_subtotal->TaxCategory = $tc;
+
+$tax_total = new TaxTotal();
+$tax_total->TaxAmount = $tax_amount;
+$tax_total->TaxSubtotal[] = $tax_subtotal;
+$item_taxes[] = $tax_total;
+
+
+ }
+
+ return $item_taxes;
+ }
+
+ private function getAccountingSupplierParty(): AccountingSupplierParty
+ {
+
+ $asp = new AccountingSupplierParty();
+
+ $party = new Party();
+ $party_name = new PartyName;
+ $party_name->Name = $this->invoice->company->present()->name();
+ $party->PartyName[] = $party_name;
+
+ $address = new Address();
+ $address->CityName = $this->invoice->company->settings->city;
+ $address->StreetName = $this->invoice->company->settings->address1;
+ // $address->BuildingName = $this->invoice->company->settings->address2;
+ $address->PostalZone = $this->invoice->company->settings->postal_code;
+ $address->CountrySubentity = $this->invoice->company->settings->state;
+ // $address->CountrySubentityCode = $this->invoice->company->settings->state;
+
+ $country = new Country();
+ $country->IdentificationCode = $this->invoice->company->country()->iso_3166_2;
+ $address->Country = $country;
+
+ $party->PostalAddress = $address;
+ $party->PhysicalLocation = $address;
+
+ $contact = new Contact();
+ $contact->ElectronicMail = $this->invoice->company->owner()->email ?? 'owner@gmail.com';
+
+ $party->Contact = $contact;
+
+ $asp->Party = $party;
+
+ return $asp;
+ }
+
+ private function getAccountingCustomerParty(): AccountingCustomerParty
+ {
+
+ $acp = new AccountingCustomerParty();
+
+ $party = new Party();
+
+ $party_name = new PartyName();
+ $party_name->Name = $this->invoice->client->present()->name();
+ $party->PartyName[] = $party_name;
+
+ $address = new Address();
+ $address->CityName = $this->invoice->client->city;
+ $address->StreetName = $this->invoice->client->address1;
+ // $address->BuildingName = $this->invoice->client->address2;
+ $address->PostalZone = $this->invoice->client->postal_code;
+ $address->CountrySubentity = $this->invoice->client->state;
+ // $address->CountrySubentityCode = $this->invoice->client->state;
+
+
+ $country = new Country();
+ $country->IdentificationCode = $this->invoice->client->country->iso_3166_2;
+ $address->Country = $country;
+
+ $party->PostalAddress = $address;
+ $party->PhysicalLocation = $address;
+
+ $contact = new Contact();
+ $contact->ElectronicMail = $this->invoice->client->present()->email();
+
+ $party->Contact = $contact;
+
+ $acp->Party = $party;
+
+ return $acp;
+ }
+
+ private function getTaxable(): float
+ {
+ $total = 0;
+
+ foreach ($this->invoice->line_items as $item) {
+ $line_total = $item->quantity * $item->cost;
+
+ if ($item->discount != 0) {
+ if ($this->invoice->is_amount_discount) {
+ $line_total -= $item->discount;
+ } else {
+ $line_total -= $line_total * $item->discount / 100;
+ }
+ }
+
+ $total += $line_total;
+ }
+
+ if ($this->invoice->discount > 0) {
+ if ($this->invoice->is_amount_discount) {
+ $total -= $this->invoice->discount;
+ } else {
+ $total *= (100 - $this->invoice->discount) / 100;
+ $total = round($total, 2);
+ }
+ }
+
+ if ($this->invoice->custom_surcharge1 && $this->invoice->custom_surcharge_tax1) {
+ $total += $this->invoice->custom_surcharge1;
+ }
+
+ if ($this->invoice->custom_surcharge2 && $this->invoice->custom_surcharge_tax2) {
+ $total += $this->invoice->custom_surcharge2;
+ }
+
+ if ($this->invoice->custom_surcharge3 && $this->invoice->custom_surcharge_tax3) {
+ $total += $this->invoice->custom_surcharge3;
+ }
+
+ if ($this->invoice->custom_surcharge4 && $this->invoice->custom_surcharge_tax4) {
+ $total += $this->invoice->custom_surcharge4;
+ }
+
+ return $total;
+ }
+
+}
\ No newline at end of file
diff --git a/app/Services/EDocument/Standards/ZugferdEDokument.php b/app/Services/EDocument/Standards/ZugferdEDokument.php
index 9638563cf77c..0b9f776ec435 100644
--- a/app/Services/EDocument/Standards/ZugferdEDokument.php
+++ b/app/Services/EDocument/Standards/ZugferdEDokument.php
@@ -32,8 +32,13 @@ class ZugferdEDokument extends AbstractService
public function run(): self
{
+ /** @var \App\Models\Company $company */
$company = $this->document->company;
+
+
+ /** @var \App\Models\Client $client */
$client = $this->document->client;
+
$profile = $client->getSetting('e_invoice_type');
$profile = match ($profile) {
diff --git a/app/Services/Email/Email.php b/app/Services/Email/Email.php
index f1bd7ee01d11..8b8162a278a3 100644
--- a/app/Services/Email/Email.php
+++ b/app/Services/Email/Email.php
@@ -303,11 +303,6 @@ class Email implements ShouldQueue
$this->logMailError($e->getMessage(), $this->company->clients()->first());
return;
}
- catch(\Symfony\Component\Mailer\Transport\Dsn $e){
- nlog("Incorrectly configured mail server - setting to default mail driver.");
- $this->email_object->settings->email_sending_method = 'default';
- return $this->setMailDriver();
- }
catch(\Google\Service\Exception $e){
if ($e->getCode() == '429') {
@@ -326,7 +321,7 @@ class Email implements ShouldQueue
$message = $e->getMessage();
- if (stripos($e->getMessage(), 'code 300') || stripos($e->getMessage(), 'code 413')) {
+ if (stripos($e->getMessage(), 'code 300') !== false || stripos($e->getMessage(), 'code 413') !== false) {
$message = "Either Attachment too large, or recipient has been suppressed.";
$this->fail();
@@ -337,8 +332,16 @@ class Email implements ShouldQueue
return;
}
+
+ if(stripos($e->getMessage(), 'Dsn') !== false) {
- if (stripos($e->getMessage(), 'code 406')) {
+ nlog("Incorrectly configured mail server - setting to default mail driver.");
+ $this->email_object->settings->email_sending_method = 'default';
+ return $this->setMailDriver();
+
+ }
+
+ if (stripos($e->getMessage(), 'code 406') !== false) {
$address_object = reset($this->email_object->to);
@@ -613,17 +616,17 @@ class Email implements ShouldQueue
$company = $this->company;
- $smtp_host = $company->smtp_host;
+ $smtp_host = $company->smtp_host ?? '';
$smtp_port = $company->smtp_port;
- $smtp_username = $company->smtp_username;
- $smtp_password = $company->smtp_password;
+ $smtp_username = $company->smtp_username ?? '';
+ $smtp_password = $company->smtp_password ?? '';
$smtp_encryption = $company->smtp_encryption ?? 'tls';
$smtp_local_domain = strlen($company->smtp_local_domain) > 2 ? $company->smtp_local_domain : null;
$smtp_verify_peer = $company->smtp_verify_peer ?? true;
- if(strlen($smtp_host ?? '') <= 1 ||
- strlen($smtp_username ?? '') <= 1 ||
- strlen($smtp_password ?? '') <= 1
+ if(strlen($smtp_host) <= 1 ||
+ strlen($smtp_username) <= 1 ||
+ strlen($smtp_password) <= 1
) {
$this->email_object->settings->email_sending_method = 'default';
return $this->setMailDriver();
diff --git a/app/Services/Invoice/AutoBillInvoice.php b/app/Services/Invoice/AutoBillInvoice.php
index 67fe56aacfd8..d6ecd64117b0 100644
--- a/app/Services/Invoice/AutoBillInvoice.php
+++ b/app/Services/Invoice/AutoBillInvoice.php
@@ -11,22 +11,25 @@
namespace App\Services\Invoice;
-use App\Events\Invoice\InvoiceWasPaid;
-use App\Events\Payment\PaymentWasCreated;
-use App\Factory\PaymentFactory;
-use App\Libraries\MultiDB;
+use Carbon\Carbon;
+use App\Utils\Ninja;
+use App\Utils\Number;
use App\Models\Client;
-use App\Models\ClientGatewayToken;
use App\Models\Credit;
use App\Models\Invoice;
use App\Models\Payment;
+use App\Libraries\MultiDB;
use App\Models\PaymentHash;
use App\Models\PaymentType;
+use Illuminate\Support\Str;
+use App\DataMapper\InvoiceItem;
+use App\Factory\PaymentFactory;
+use App\Services\AbstractService;
+use App\Models\ClientGatewayToken;
+use App\Events\Invoice\InvoiceWasPaid;
use App\Repositories\CreditRepository;
use App\Repositories\PaymentRepository;
-use App\Services\AbstractService;
-use App\Utils\Ninja;
-use Illuminate\Support\Str;
+use App\Events\Payment\PaymentWasCreated;
class AutoBillInvoice extends AbstractService
{
@@ -205,11 +208,27 @@ class AutoBillInvoice extends AbstractService
info("adjusting credit balance {$current_credit->balance} by this amount ".$credit['amount']);
+
+ $item_date = Carbon::parse($payment->date)->format($payment->client->date_format());
+ $invoice_numbers = $this->invoice->number;
+
+ $item = new InvoiceItem();
+ $item->quantity = 0;
+ $item->cost = $credit['amount'] * -1;
+ $item->notes = "{$item_date} - " . ctrans('texts.credit_payment', ['invoice_number' => $invoice_numbers]) . " ". Number::formatMoney($credit['amount'], $payment->client);
+ $item->type_id = "1";
+
+ $line_items = $current_credit->line_items;
+ $line_items[] = $item;
+ $current_credit->line_items = $line_items;
+
+
$current_credit->service()
->adjustBalance($credit['amount'] * -1)
->updatePaidToDate($credit['amount'])
->setCalculatedStatus()
->save();
+
}
$payment->ledger()
@@ -240,6 +259,7 @@ class AutoBillInvoice extends AbstractService
return $this->invoice
->service()
->setCalculatedStatus()
+ ->workFlow() //07-06-2024 - run the workflow if paid!
->save();
}
diff --git a/composer.lock b/composer.lock
index 58bee20e1c28..8e77985a9844 100644
--- a/composer.lock
+++ b/composer.lock
@@ -1385,16 +1385,16 @@
},
{
"name": "aws/aws-sdk-php",
- "version": "3.309.0",
+ "version": "3.311.1",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
- "reference": "9213b2101afa17fe8ea99b8ea2dad85c1b1166a8"
+ "reference": "90218b9372469babf294f97bdd764c9d47ec8a57"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/9213b2101afa17fe8ea99b8ea2dad85c1b1166a8",
- "reference": "9213b2101afa17fe8ea99b8ea2dad85c1b1166a8",
+ "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/90218b9372469babf294f97bdd764c9d47ec8a57",
+ "reference": "90218b9372469babf294f97bdd764c9d47ec8a57",
"shasum": ""
},
"require": {
@@ -1474,9 +1474,9 @@
"support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues",
- "source": "https://github.com/aws/aws-sdk-php/tree/3.309.0"
+ "source": "https://github.com/aws/aws-sdk-php/tree/3.311.1"
},
- "time": "2024-06-03T18:10:07+00:00"
+ "time": "2024-06-06T18:05:50+00:00"
},
{
"name": "bacon/bacon-qr-code",
@@ -4630,16 +4630,16 @@
},
{
"name": "horstoeko/zugferd",
- "version": "v1.0.51",
+ "version": "v1.0.53",
"source": {
"type": "git",
"url": "https://github.com/horstoeko/zugferd.git",
- "reference": "9e036d4a9660638b4f51d2babb397fcff29ef046"
+ "reference": "939e93ab2e84ec476735e5957f4db7e7d58880c3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/horstoeko/zugferd/zipball/9e036d4a9660638b4f51d2babb397fcff29ef046",
- "reference": "9e036d4a9660638b4f51d2babb397fcff29ef046",
+ "url": "https://api.github.com/repos/horstoeko/zugferd/zipball/939e93ab2e84ec476735e5957f4db7e7d58880c3",
+ "reference": "939e93ab2e84ec476735e5957f4db7e7d58880c3",
"shasum": ""
},
"require": {
@@ -4699,9 +4699,9 @@
],
"support": {
"issues": "https://github.com/horstoeko/zugferd/issues",
- "source": "https://github.com/horstoeko/zugferd/tree/v1.0.51"
+ "source": "https://github.com/horstoeko/zugferd/tree/v1.0.53"
},
- "time": "2024-05-31T17:20:07+00:00"
+ "time": "2024-06-05T16:49:22+00:00"
},
{
"name": "http-interop/http-factory-guzzle",
@@ -5076,16 +5076,17 @@
"source": {
"type": "git",
"url": "https://github.com/invoiceninja/einvoice.git",
- "reference": "228560c6eea03d9ae10a174a0d9f1456efc5eabd"
+ "reference": "1b9a488d65715272941f1ae6ddfe2d94ad25c2c1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/invoiceninja/einvoice/zipball/228560c6eea03d9ae10a174a0d9f1456efc5eabd",
- "reference": "228560c6eea03d9ae10a174a0d9f1456efc5eabd",
+ "url": "https://api.github.com/repos/invoiceninja/einvoice/zipball/1b9a488d65715272941f1ae6ddfe2d94ad25c2c1",
+ "reference": "1b9a488d65715272941f1ae6ddfe2d94ad25c2c1",
"shasum": ""
},
"require": {
- "illuminate/collections": "^10.48",
+ "illuminate/collections": "^10|^11",
+ "php": "^8.2",
"phpdocumentor/reflection-docblock": "^5.4",
"sabre/xml": "^4.0",
"symfony/property-access": "^7",
@@ -5094,6 +5095,7 @@
"symfony/validator": "^7"
},
"require-dev": {
+ "friendsofphp/php-cs-fixer": "^3.58",
"milo/schematron": "^1.0",
"nette/php-generator": "^4.1",
"phpstan/phpstan": "^1.11",
@@ -5104,7 +5106,7 @@
"type": "library",
"autoload": {
"psr-4": {
- "Invoiceninja\\Einvoice\\": "src/"
+ "InvoiceNinja\\EInvoice\\": "src/"
}
},
"license": [
@@ -5121,7 +5123,7 @@
"source": "https://github.com/invoiceninja/einvoice/tree/main",
"issues": "https://github.com/invoiceninja/einvoice/issues"
},
- "time": "2024-06-03T07:03:23+00:00"
+ "time": "2024-06-07T04:32:09+00:00"
},
{
"name": "invoiceninja/inspector",
@@ -12517,16 +12519,16 @@
},
{
"name": "symfony/css-selector",
- "version": "v7.1.0",
+ "version": "v7.1.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
- "reference": "843f2f7ac5e4c5bf0ec77daef23ca6d4d8922adc"
+ "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/css-selector/zipball/843f2f7ac5e4c5bf0ec77daef23ca6d4d8922adc",
- "reference": "843f2f7ac5e4c5bf0ec77daef23ca6d4d8922adc",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4",
+ "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4",
"shasum": ""
},
"require": {
@@ -12562,7 +12564,7 @@
"description": "Converts CSS selectors to XPath expressions",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/css-selector/tree/v7.1.0"
+ "source": "https://github.com/symfony/css-selector/tree/v7.1.1"
},
"funding": [
{
@@ -12578,7 +12580,7 @@
"type": "tidelift"
}
],
- "time": "2024-04-18T09:32:20+00:00"
+ "time": "2024-05-31T14:57:53+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -12724,16 +12726,16 @@
},
{
"name": "symfony/event-dispatcher",
- "version": "v7.1.0",
+ "version": "v7.1.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "522d2772d6c7bab843b0c52466dc7844622bacc2"
+ "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/522d2772d6c7bab843b0c52466dc7844622bacc2",
- "reference": "522d2772d6c7bab843b0c52466dc7844622bacc2",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7",
+ "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7",
"shasum": ""
},
"require": {
@@ -12784,7 +12786,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.0"
+ "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1"
},
"funding": [
{
@@ -12800,7 +12802,7 @@
"type": "tidelift"
}
],
- "time": "2024-04-18T09:32:20+00:00"
+ "time": "2024-05-31T14:57:53+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
@@ -13372,16 +13374,16 @@
},
{
"name": "symfony/intl",
- "version": "v7.1.0",
+ "version": "v7.1.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/intl.git",
- "reference": "1b8974c7ff07c61d4acf0e873e34dfb75190b2bb"
+ "reference": "66c1ecda092b1130ada2cf5f59dacfd5b6e9c99c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/intl/zipball/1b8974c7ff07c61d4acf0e873e34dfb75190b2bb",
- "reference": "1b8974c7ff07c61d4acf0e873e34dfb75190b2bb",
+ "url": "https://api.github.com/repos/symfony/intl/zipball/66c1ecda092b1130ada2cf5f59dacfd5b6e9c99c",
+ "reference": "66c1ecda092b1130ada2cf5f59dacfd5b6e9c99c",
"shasum": ""
},
"require": {
@@ -13438,7 +13440,7 @@
"localization"
],
"support": {
- "source": "https://github.com/symfony/intl/tree/v7.1.0"
+ "source": "https://github.com/symfony/intl/tree/v7.1.1"
},
"funding": [
{
@@ -13454,7 +13456,7 @@
"type": "tidelift"
}
],
- "time": "2024-04-18T09:32:20+00:00"
+ "time": "2024-05-31T14:57:53+00:00"
},
{
"name": "symfony/mailer",
@@ -13692,16 +13694,16 @@
},
{
"name": "symfony/options-resolver",
- "version": "v7.1.0",
+ "version": "v7.1.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/options-resolver.git",
- "reference": "9564f64c16f99e29f252eafc642965e8fcb755ce"
+ "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/options-resolver/zipball/9564f64c16f99e29f252eafc642965e8fcb755ce",
- "reference": "9564f64c16f99e29f252eafc642965e8fcb755ce",
+ "url": "https://api.github.com/repos/symfony/options-resolver/zipball/47aa818121ed3950acd2b58d1d37d08a94f9bf55",
+ "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55",
"shasum": ""
},
"require": {
@@ -13739,7 +13741,7 @@
"options"
],
"support": {
- "source": "https://github.com/symfony/options-resolver/tree/v7.1.0"
+ "source": "https://github.com/symfony/options-resolver/tree/v7.1.1"
},
"funding": [
{
@@ -13755,7 +13757,7 @@
"type": "tidelift"
}
],
- "time": "2024-04-18T09:32:20+00:00"
+ "time": "2024-05-31T14:57:53+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -14685,16 +14687,16 @@
},
{
"name": "symfony/property-access",
- "version": "v7.1.0",
+ "version": "v7.1.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/property-access.git",
- "reference": "1e8c1e6ac1b19cf945d8094a0ee50296872c4cb2"
+ "reference": "74e39e6a6276b8e384f34c6ddbc10a6c9a60193a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/property-access/zipball/1e8c1e6ac1b19cf945d8094a0ee50296872c4cb2",
- "reference": "1e8c1e6ac1b19cf945d8094a0ee50296872c4cb2",
+ "url": "https://api.github.com/repos/symfony/property-access/zipball/74e39e6a6276b8e384f34c6ddbc10a6c9a60193a",
+ "reference": "74e39e6a6276b8e384f34c6ddbc10a6c9a60193a",
"shasum": ""
},
"require": {
@@ -14741,7 +14743,7 @@
"reflection"
],
"support": {
- "source": "https://github.com/symfony/property-access/tree/v7.1.0"
+ "source": "https://github.com/symfony/property-access/tree/v7.1.1"
},
"funding": [
{
@@ -14757,20 +14759,20 @@
"type": "tidelift"
}
],
- "time": "2024-04-18T09:32:20+00:00"
+ "time": "2024-05-31T14:57:53+00:00"
},
{
"name": "symfony/property-info",
- "version": "v7.1.0",
+ "version": "v7.1.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/property-info.git",
- "reference": "b10cb8cf0179aec96769df2affb881ecfc293f79"
+ "reference": "0f80f818c6728f15de30a4f89866d68e4912ae84"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/property-info/zipball/b10cb8cf0179aec96769df2affb881ecfc293f79",
- "reference": "b10cb8cf0179aec96769df2affb881ecfc293f79",
+ "url": "https://api.github.com/repos/symfony/property-info/zipball/0f80f818c6728f15de30a4f89866d68e4912ae84",
+ "reference": "0f80f818c6728f15de30a4f89866d68e4912ae84",
"shasum": ""
},
"require": {
@@ -14825,7 +14827,7 @@
"validator"
],
"support": {
- "source": "https://github.com/symfony/property-info/tree/v7.1.0"
+ "source": "https://github.com/symfony/property-info/tree/v7.1.1"
},
"funding": [
{
@@ -14841,7 +14843,7 @@
"type": "tidelift"
}
],
- "time": "2024-05-30T12:09:55+00:00"
+ "time": "2024-05-31T14:57:53+00:00"
},
{
"name": "symfony/psr-http-message-bridge",
@@ -15017,16 +15019,16 @@
},
{
"name": "symfony/serializer",
- "version": "v7.1.0",
+ "version": "v7.1.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/serializer.git",
- "reference": "972eb05320d06d07399b71b05e6da9032c865f1d"
+ "reference": "74817ee48e37cce1a1b33c66ffdb750e7e048c3c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/serializer/zipball/972eb05320d06d07399b71b05e6da9032c865f1d",
- "reference": "972eb05320d06d07399b71b05e6da9032c865f1d",
+ "url": "https://api.github.com/repos/symfony/serializer/zipball/74817ee48e37cce1a1b33c66ffdb750e7e048c3c",
+ "reference": "74817ee48e37cce1a1b33c66ffdb750e7e048c3c",
"shasum": ""
},
"require": {
@@ -15094,7 +15096,7 @@
"description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/serializer/tree/v7.1.0"
+ "source": "https://github.com/symfony/serializer/tree/v7.1.1"
},
"funding": [
{
@@ -15110,7 +15112,7 @@
"type": "tidelift"
}
],
- "time": "2024-05-21T15:59:31+00:00"
+ "time": "2024-05-31T14:57:53+00:00"
},
{
"name": "symfony/service-contracts",
@@ -15197,16 +15199,16 @@
},
{
"name": "symfony/string",
- "version": "v7.1.0",
+ "version": "v7.1.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "6f41b185e742737917e6f2e3eca37767fba5f17a"
+ "reference": "60bc311c74e0af215101235aa6f471bcbc032df2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/6f41b185e742737917e6f2e3eca37767fba5f17a",
- "reference": "6f41b185e742737917e6f2e3eca37767fba5f17a",
+ "url": "https://api.github.com/repos/symfony/string/zipball/60bc311c74e0af215101235aa6f471bcbc032df2",
+ "reference": "60bc311c74e0af215101235aa6f471bcbc032df2",
"shasum": ""
},
"require": {
@@ -15264,7 +15266,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v7.1.0"
+ "source": "https://github.com/symfony/string/tree/v7.1.1"
},
"funding": [
{
@@ -15280,7 +15282,7 @@
"type": "tidelift"
}
],
- "time": "2024-05-17T10:55:18+00:00"
+ "time": "2024-06-04T06:40:14+00:00"
},
{
"name": "symfony/translation",
@@ -15457,16 +15459,16 @@
},
{
"name": "symfony/type-info",
- "version": "v7.1.0",
+ "version": "v7.1.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/type-info.git",
- "reference": "b429d0710588fc396ba5def5329cf637d9861f9f"
+ "reference": "60b28eb733f1453287f1263ed305b96091e0d1dc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/type-info/zipball/b429d0710588fc396ba5def5329cf637d9861f9f",
- "reference": "b429d0710588fc396ba5def5329cf637d9861f9f",
+ "url": "https://api.github.com/repos/symfony/type-info/zipball/60b28eb733f1453287f1263ed305b96091e0d1dc",
+ "reference": "60b28eb733f1453287f1263ed305b96091e0d1dc",
"shasum": ""
},
"require": {
@@ -15519,7 +15521,7 @@
"type"
],
"support": {
- "source": "https://github.com/symfony/type-info/tree/v7.1.0"
+ "source": "https://github.com/symfony/type-info/tree/v7.1.1"
},
"funding": [
{
@@ -15535,7 +15537,7 @@
"type": "tidelift"
}
],
- "time": "2024-05-02T10:19:13+00:00"
+ "time": "2024-05-31T14:59:31+00:00"
},
{
"name": "symfony/uid",
@@ -15613,16 +15615,16 @@
},
{
"name": "symfony/validator",
- "version": "v7.1.0",
+ "version": "v7.1.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/validator.git",
- "reference": "ffcc8c56502f6adaeaf6307aef5b98b53a8d0326"
+ "reference": "fcab7598968b21c361becc930fcae8846638c4c0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/validator/zipball/ffcc8c56502f6adaeaf6307aef5b98b53a8d0326",
- "reference": "ffcc8c56502f6adaeaf6307aef5b98b53a8d0326",
+ "url": "https://api.github.com/repos/symfony/validator/zipball/fcab7598968b21c361becc930fcae8846638c4c0",
+ "reference": "fcab7598968b21c361becc930fcae8846638c4c0",
"shasum": ""
},
"require": {
@@ -15669,7 +15671,8 @@
"Symfony\\Component\\Validator\\": ""
},
"exclude-from-classmap": [
- "/Tests/"
+ "/Tests/",
+ "/Resources/bin/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -15689,7 +15692,7 @@
"description": "Provides tools to validate values",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/validator/tree/v7.1.0"
+ "source": "https://github.com/symfony/validator/tree/v7.1.1"
},
"funding": [
{
@@ -15705,7 +15708,7 @@
"type": "tidelift"
}
],
- "time": "2024-05-21T15:59:31+00:00"
+ "time": "2024-06-04T05:58:56+00:00"
},
{
"name": "symfony/var-dumper",
@@ -18242,16 +18245,16 @@
},
{
"name": "phpstan/phpstan",
- "version": "1.11.3",
+ "version": "1.11.4",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
- "reference": "e64220a05c1209fc856d58e789c3b7a32c0bb9a5"
+ "reference": "9100a76ce8015b9aa7125b9171ae3a76887b6c82"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e64220a05c1209fc856d58e789c3b7a32c0bb9a5",
- "reference": "e64220a05c1209fc856d58e789c3b7a32c0bb9a5",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9100a76ce8015b9aa7125b9171ae3a76887b6c82",
+ "reference": "9100a76ce8015b9aa7125b9171ae3a76887b6c82",
"shasum": ""
},
"require": {
@@ -18296,7 +18299,7 @@
"type": "github"
}
],
- "time": "2024-05-31T13:53:37+00:00"
+ "time": "2024-06-06T12:19:22+00:00"
},
{
"name": "phpunit/php-code-coverage",
@@ -20613,16 +20616,16 @@
},
{
"name": "symfony/stopwatch",
- "version": "v7.1.0",
+ "version": "v7.1.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/stopwatch.git",
- "reference": "13c750a45ac43c45f45d944d22499768aa1b72d8"
+ "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/stopwatch/zipball/13c750a45ac43c45f45d944d22499768aa1b72d8",
- "reference": "13c750a45ac43c45f45d944d22499768aa1b72d8",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d",
+ "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d",
"shasum": ""
},
"require": {
@@ -20655,7 +20658,7 @@
"description": "Provides a way to profile code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/stopwatch/tree/v7.1.0"
+ "source": "https://github.com/symfony/stopwatch/tree/v7.1.1"
},
"funding": [
{
@@ -20671,7 +20674,7 @@
"type": "tidelift"
}
],
- "time": "2024-04-18T09:32:20+00:00"
+ "time": "2024-05-31T14:57:53+00:00"
},
{
"name": "theseer/tokenizer",
diff --git a/config/app.php b/config/app.php
index 6caa54bcbe71..ddeb918ec94a 100644
--- a/config/app.php
+++ b/config/app.php
@@ -201,7 +201,7 @@ return [
App\Providers\MultiDBProvider::class,
App\Providers\ClientPortalServiceProvider::class,
App\Providers\NinjaTranslationServiceProvider::class,
- App\Providers\StaticServiceProvider::class,
+ App\Providers\StaticServiceProvider::class,
],
/*
diff --git a/config/ninja.php b/config/ninja.php
index c67dc777a416..c617c33e5811 100644
--- a/config/ninja.php
+++ b/config/ninja.php
@@ -17,8 +17,8 @@ return [
'require_https' => env('REQUIRE_HTTPS', true),
'app_url' => rtrim(env('APP_URL', ''), '/'),
'app_domain' => env('APP_DOMAIN', 'invoicing.co'),
- 'app_version' => env('APP_VERSION', '5.9.2'),
- 'app_tag' => env('APP_TAG', '5.9.2'),
+ 'app_version' => env('APP_VERSION', '5.9.3'),
+ 'app_tag' => env('APP_TAG', '5.9.3'),
'minimum_client_version' => '5.0.16',
'terms_version' => '1.0.1',
'api_secret' => env('API_SECRET', false),
diff --git a/lang/en/texts.php b/lang/en/texts.php
index 003509f2c939..375bfbf5ecb3 100644
--- a/lang/en/texts.php
+++ b/lang/en/texts.php
@@ -5334,6 +5334,7 @@ $lang = array(
'btcpay_refund_body' => 'A refund intended for you has been issued. To claim it via BTCPay, please click on this link:',
'currency_mauritanian_ouguiya' => 'Mauritanian Ouguiya',
'currency_bhutan_ngultrum' => 'Bhutan Ngultrum',
+ 'end_of_month' => 'End Of Month'
);
return $lang;
\ No newline at end of file
diff --git a/modules_statuses.json b/modules_statuses.json
index c5249869a55c..2bb10713c712 100644
--- a/modules_statuses.json
+++ b/modules_statuses.json
@@ -1,4 +1,3 @@
{
- "Admin": true,
- "Ronin": true
+ "Admin": true
}
diff --git a/openapi/api-docs.yaml b/openapi/api-docs.yaml
index 593cf67846a0..78a77d2b2275 100644
--- a/openapi/api-docs.yaml
+++ b/openapi/api-docs.yaml
@@ -3,24 +3,91 @@ info:
title: 'Invoice Ninja API Reference.'
description: |
---
-
-
- The Invoice Ninja API is organized around REST and returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs.
-
-
+ ## Introduction
+ Welcome to the Invoice Ninja API documentation, your comprehensive guide to integrating Invoice Ninja's powerful features into your applications. Whether you're building a custom client, automating workflows, or integrating with other systems, our API provides the tools you need to streamline your invoicing and billing processes.
+ ## What is Invoice Ninja?
+ Invoice Ninja is a robust source-available platform designed to simplify invoicing, billing, and payment management for freelancers, small businesses, and enterprises alike. With a user-friendly interface, customizable templates, and a suite of powerful features, Invoice Ninja empowers businesses to create professional invoices, track expenses, manage clients, and get paid faster.
+
+ ## Why use the Invoice Ninja API?
+ The Invoice Ninja API allows developers to extend the functionality of Invoice Ninja by programmatically accessing and manipulating data within their Invoice Ninja accounts. With the API, you can automate repetitive tasks, integrate with third-party services, and build custom solutions tailored to your specific business needs.
+
+ ## Getting Started
+ To get started with the Invoice Ninja API, you'll need an active Invoice Ninja account (or your own self hosted installation) and API credentials. If you haven't already done so, sign up for an account at Invoice Ninja and generate your API keys from the settings section.
+
+ Once you have your API credentials, you can start exploring the API endpoints, authentication methods, request and response formats, and more using the documentation provided here.
+
+ ## Explore the Documentation
+ This documentation is organized into sections to help you navigate and understand the various aspects of the Invoice Ninja API:
+
+ Authentication: Learn how to authenticate your requests to the API using API tokens.
+ Endpoints: Explore the available API endpoints for managing invoices, clients, payments, expenses, and more.
+ Request and Response Formats: Understand the structure of API requests and responses, including parameters, headers, and payloads.
+ Error Handling: Learn about error codes, status messages, and best practices for handling errors gracefully.
+ Code Examples: Find code examples and tutorials to help you get started with integrating the Invoice Ninja API into your applications.
+
+ ## Need Help?
+
+ If you have any questions, encounter any issues, or need assistance with using the Invoice Ninja API, don't hesitate to reach out to our support team or join our community forums. We're here to help you succeed with Invoice Ninja and make the most of our API.
+
+ Let's start building together!
+
+ ## Endpoints
+
+
+
Production: https://invoicing.co
+
Demo: https://demo.invoiceninja.com
+
+
+ ## Client Libraries
+
+ PHP SDK can be found [here](https://github.com/invoiceninja/sdk-php)
+
+ ## Authentication:
+
+ Invoice Ninja uses API tokens to authenticate requests. You can view and manage your API keys in Settings > Account Management > Integrations > API tokens
+
+ API requests must be made over HTTPS. Calls made to HTTP will fail.
+
+ ## Errors:
+
+ Invoice Ninja uses standard HTTP response codes to indicate the success or failure of a request. below is a table of standard status codes and responses
+
+ | Status Code | Explanation |
+ |-------------|-----------------------------------------------------------------------------|
+ | 200 | OK: The request has succeeded. The information returned with the response is dependent on the method used in the request. |
+ | 301 | Moved Permanently: This and all future requests should be directed to the given URI. |
+ | 303 | See Other: The response to the request can be found under another URI using the GET method. |
+ | 400 | Bad Request: The server cannot or will not process the request due to an apparent client error. |
+ | 401 | Unauthorized: Similar to 403 Forbidden, but specifically for use when authentication is required and has failed or has not yet been provided. |
+ | 403 | Forbidden: The request was valid, but the server is refusing action. |
+ | 404 | Not Found: The requested resource could not be found but may be available in the future. |
+ | 405 | Method Not Allowed: A request method is not supported for the requested resource. |
+ | 409 | Conflict: Indicates that the request could not be processed because of conflict in the request. |
+ | 422 | Unprocessable Entity: The request was well-formed but was unable to be followed due to semantic errors. |
+ | 429 | Too Many Requests: The user has sent too many requests in a given amount of time ("rate limiting"). |
+ | 500 | Internal Server Error: A generic error message, given when an unexpected condition was encountered and no more specific message is suitable. |
+
+ ## Pagination
+
+ When using index routes to retrieve lists of data, by default we limit the number of records returned to 20. You can using standard pagination to paginate results, ie:
termsOfService: 'https://invoiceninja.github.io/docs/legal/terms_of_service/#page-content'
contact:
email: contact@invoiceninja.com
+ name: Invoice Ninja Support
+ url: 'https://www.invoiceninja.com'
license:
name: 'Elastic License'
url: 'https://www.elastic.co/licensing/elastic-license'
- version: 5.8.34
+ version: 5.9.2
servers:
- - url: "https://demo.invoiceninja.com"
- description: |
- ## Demo API Server InvoiceNinja.
+ - url: 'https://demo.invoiceninja.com'
+ description: |
+ ## Demo API endpoint
You can use the demo API key `TOKEN` to test the endpoints from within this API spec
+ - url: 'https://invoicing.co'
+ description: |
+ ## Production API endpoint
paths:
/api/v1/activities:
get:
@@ -48,10 +115,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/Activity'
@@ -113,9 +180,9 @@ paths:
- login
summary: "Attempts authentication"
description: |
- After authenticating with the API, the returned object is a CompanyUser object which is a bridge linking the user to the company.
+ After authenticating with the API, the returned object is a CompanyUser object which is a bridge linking the user to the company.
- The company user object itself contains the users permissions (admin/owner or fine grained permissions) You will most likely want to
+ The company user object itself contains the users permissions (admin/owner or fine grained permissions) You will most likely want to
also include in the response of this object both the company and the user object, this can be done by using the include parameter.
/api/v1/login?include=company,user
@@ -139,12 +206,10 @@ paths:
description: "The users email address."
type: string
example: "demo@invoiceninja.com"
- required: true
password:
description: "The user password. Must meet minimum criteria ~ > 6 characters"
type: string
example: "Password0"
- required: true
one_time_password:
description: "The one time password if 2FA is enabled"
type: string
@@ -185,7 +250,7 @@ paths:
- refresh
summary: "Refresh data by timestamp"
description: |
- Refreshes the dataset.
+ Refreshes the dataset.
This endpoint can be used if you only need to access the most recent data from a certain point in time. For example, if you only want to retrieve The
most recent data from the last time you accessed the system, you would pass the query parameter ?updated_at=1676173763. (unix timestamp)
@@ -298,10 +363,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/BankIntegration'
@@ -754,10 +819,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/BankTransaction'
@@ -1139,10 +1204,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/BankTransactionRule'
@@ -1515,10 +1580,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/ClientGatewayToken'
@@ -1808,10 +1873,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/Company'
@@ -2207,10 +2272,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/CompanyGateway'
@@ -2529,10 +2594,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/CompanyLedger'
@@ -2616,7 +2681,7 @@ paths:
$ref: "#/components/responses/422"
default:
$ref: "#/components/responses/default"
-
+
/api/v1/designs:
get:
tags:
@@ -2641,10 +2706,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/Design'
@@ -2957,10 +3022,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/Document'
@@ -3058,10 +3123,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/ExpenseCategory'
@@ -3362,10 +3427,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/Expense'
@@ -3755,10 +3820,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/GroupSetting'
@@ -4216,7 +4281,7 @@ paths:
$ref: "#/components/responses/422"
default:
$ref: "#/components/responses/default"
-
+
/api/v1/claim_license:
get:
tags:
@@ -4426,7 +4491,7 @@ paths:
$ref: "#/components/responses/422"
default:
$ref: "#/components/responses/default"
-
+
/api/v1/payment_terms:
get:
tags:
@@ -4451,10 +4516,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/PaymentTerm'
@@ -4893,10 +4958,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/RecurringExpense'
@@ -5236,7 +5301,7 @@ paths:
$ref: "#/components/responses/422"
default:
$ref: "#/components/responses/default"
-
+
/api/v1/recurring_quotes:
get:
tags:
@@ -5260,10 +5325,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/RecurringQuote'
@@ -6164,10 +6229,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/Subscription'
@@ -6513,10 +6578,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/SystemLog'
@@ -6572,7 +6637,7 @@ paths:
$ref: "#/components/responses/422"
default:
$ref: "#/components/responses/default"
-
+
/api/v1/task_schedulers/:
get:
tags:
@@ -6826,10 +6891,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/TaskStatus'
@@ -7139,10 +7204,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/TaxRate'
@@ -7456,10 +7521,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/CompanyToken'
@@ -7764,10 +7829,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/User'
@@ -8168,7 +8233,7 @@ paths:
$ref: "#/components/responses/422"
default:
$ref: "#/components/responses/default"
-
+
/api/v1/webcron:
get:
tags:
@@ -8220,10 +8285,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/Webhook'
@@ -8506,13 +8571,1575 @@ paths:
default:
$ref: "#/components/responses/default"
+ /api/v1/vendors:
+ get:
+ tags:
+ - vendors
+ summary: "List vendors"
+ description: "Lists vendors, search and filters allow fine grained lists to be generated.\n\n Query parameters can be added to performed more fine grained filtering of the vendors, these are handled by the VendorFilters class which defines the methods available"
+ operationId: getVendors
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - $ref: "#/components/parameters/index"
+ responses:
+ 200:
+ description: "A list of vendors"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ data:
+ type: array
+ items:
+ $ref: '#/components/schemas/Vendor'
+ meta:
+ type: object
+ $ref: '#/components/schemas/Meta'
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ post:
+ tags:
+ - vendors
+ summary: "Create vendor"
+ description: "Adds a vendor to a company"
+ operationId: storeVendor
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ responses:
+ 200:
+ description: "Returns the saved clivendorent object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Vendor"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ "/api/v1/vendors/{id}":
+ get:
+ tags:
+ - vendors
+ summary: "Show vendor"
+ description: "Displays a vendor by id"
+ operationId: showVendor
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The vendor Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the vendor object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Vendor"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ put:
+ tags:
+ - vendors
+ summary: "Update vendor"
+ description: "Handles the updating of a vendor by id"
+ operationId: updateVendor
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Vendor Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the vendor object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Vendor"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ delete:
+ tags:
+ - vendors
+ summary: "Delete vendor"
+ description: "Handles the deletion of a vendor by id"
+ operationId: deleteVendor
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Vendor Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns a HTTP status"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ "/api/v1/vendors/{id}/edit":
+ get:
+ tags:
+ - vendors
+ summary: "Edit vendor"
+ description: "Displays a vendor by id"
+ operationId: editVendor
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Vendor Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the vendor object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Vendor"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ /api/v1/vendors/create:
+ get:
+ tags:
+ - vendors
+ summary: "Blank vendor"
+ description: "Returns a blank vendor with default values"
+ operationId: getVendorsCreate
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ responses:
+ 200:
+ description: "A blank vendor object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Vendor"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ /api/v1/vendors/bulk:
+ post:
+ tags:
+ - vendors
+ summary: "Bulk vendor actions"
+ description: ""
+ operationId: bulkVendors
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/index"
+ requestBody:
+ description: "User credentials"
+ required: true
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ description: "Array of hashed IDs to be bulk 'actioned"
+ type: integer
+ example: "[0,1,2,3]"
+ responses:
+ 200:
+ description: "The Vendor User response"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Vendor"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ "/api/v1/vendors/{id}/upload":
+ post:
+ tags:
+ - vendors
+ summary: "Uploads a vendor document"
+ description: "Handles the uploading of a document to a vendor"
+ operationId: uploadVendor
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Vendor Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ requestBody:
+ description: "File Upload Body"
+ required: true
+ content:
+ multipart/form-data:
+ schema:
+ type: object
+ properties:
+ _method:
+ type: string
+ example: PUT
+ documents:
+ type: array
+ items:
+ description: "Array of binary documents for upload"
+ type: string
+ format: binary
+ responses:
+ 200:
+ description: "Returns the Vendor object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Vendor"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ /api/v1/invoices:
+ get:
+ tags:
+ - invoices
+ summary: "List invoices"
+ description: |
+ Lists invoices with the option to chain multiple query parameters allowing fine grained filtering of the list.
+
+ operationId: getInvoices
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - $ref: "#/components/parameters/status"
+ - $ref: "#/components/parameters/client_id"
+ - $ref: "#/components/parameters/created_at"
+ - $ref: "#/components/parameters/updated_at"
+ - $ref: "#/components/parameters/is_deleted"
+ - $ref: "#/components/parameters/filter_deleted_clients"
+ - $ref: "#/components/parameters/vendor_id"
+ - name: client_status
+ in: query
+ description: |
+ A comma separated list of invoice status strings. Valid options include:
+ - all
+ - paid
+ - unpaid
+ - overdue
+ required: false
+ schema:
+ type: string
+ example: ?client_status=paid,unpaid
+ - name: number
+ in: query
+ description: |
+ Search invoices by invoice number
+ required: false
+ schema:
+ type: string
+ example: ?number=INV-001
+ - name: filter
+ in: query
+ description: |
+ Searches across a range of columns including:
+ - number
+ - po_number
+ - date
+ - amount
+ - balance
+ - custom_value1
+ - custom_value2
+ - custom_value3
+ - custom_value4
+ required: false
+ schema:
+ type: string
+ example: ?filter=bob
+ - name: without_deleted_clients
+ in: query
+ description: |
+ Returns the invoice list without the invoices of deleted clients.
+ required: false
+ schema:
+ type: string
+ example: ?without_deleted_clients=
+ - name: overdue
+ in: query
+ description: |
+ Returns the list of invoices that are overdue
+ required: false
+ schema:
+ type: string
+ example: ?over_due=
+ - name: payable
+ in: query
+ description: |
+ Returns the invoice list that are payable for a defined client. Please note, you must pass the client_id as the value for this query parameter
+ required: false
+ schema:
+ type: string
+ example: ?payable={client_id}
+ - name: sort
+ in: query
+ description: Returns the list sorted by column in ascending or descending order.
+ required: false
+ schema:
+ type: string
+ example: id|desc number|desc balance|asc
+ - name: private_notes
+ in: query
+ description: |
+ Searches on the private_notes field of the invoices
+ required: false
+ schema:
+ type: string
+ example: ?private_notes=super secret
+ responses:
+ 200:
+ description: "A list of invoices"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ data:
+ type: array
+ items:
+ $ref: '#/components/schemas/Invoice'
+ meta:
+ type: object
+ $ref: '#/components/schemas/Meta'
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ post:
+ tags:
+ - invoices
+ summary: "Create invoice"
+ description: |
+ Adds a invoice to a company
+
+ Triggered actions are available when updating or creating an invoice.
+ These are query parameters that can be chained in order to perform additional actions on the entity, these include:
+
+ ```
+ ?send_email=true [Saves and sends the invoice]
+ ?mark_sent=true [Saves and marks the invoice as sent]
+ ?paid=true [Saves and marks the invoice as paid]
+ ?amount_paid=100 [Saves and marks the invoice as paid with the given amount]
+ ?cancel=true [Saves and marks the invoice as cancelled]
+ ?save_default_footer=true [Saves the current footer as the default footer]
+ ?save_default_terms=true [Saves the current terms as the default terms]
+ ```
+
+ operationId: storeInvoice
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/InvoiceRequest"
+ responses:
+ 200:
+ description: "Returns the saved invoice entity"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Invoice"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+
+ "/api/v1/invoices/{id}":
+ get:
+ tags:
+ - invoices
+ summary: "Show invoice"
+ description: "Displays an invoice by id"
+ operationId: showInvoice
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Invoice Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the invoice object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Invoice"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+
+ put:
+ tags:
+ - invoices
+ summary: "Update invoice"
+ description: |
+ Handles the updating of an invoice by id.
+
+ Triggered actions are available when updating or creating an invoice.
+ These are query parameters that can be chained in order to perform additional actions on the entity, these include:
+
+ ```
+ ?send_email=true [Saves and sends the invoice]
+ ?mark_sent=true [Saves and marks the invoice as sent]
+ ?paid=true [Saves and marks the invoice as paid]
+ ?amount_paid=100 [Saves and marks the invoice as paid with the given amount]
+ ?cancel=true [Saves and marks the invoice as cancelled]
+ ?save_default_footer=true [Saves the current footer as the default footer]
+ ?save_default_terms=true [Saves the current terms as the default terms]
+ ```
+
+ operationId: updateInvoice
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Invoice Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the invoice object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Invoice"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ delete:
+ tags:
+ - invoices
+ summary: "Delete invoice"
+ description: "Handles the deletion of an invoice by id"
+ operationId: deleteInvoice
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Invoice Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns a HTTP status"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ "/api/v1/invoices/{id}/edit":
+ get:
+ tags:
+ - invoices
+ summary: "Edit invoice"
+ description: "Displays an invoice by id for editting"
+ operationId: editInvoice
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Invoice Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the invoice object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Invoice"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+
+ /api/v1/invoices/create:
+ get:
+ tags:
+ - invoices
+ summary: "Blank invoice"
+ description: "Returns a blank object with default values"
+ operationId: getInvoicesCreate
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ responses:
+ 200:
+ description: "A blank invoice object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Invoice"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+
+ /api/v1/invoices/bulk:
+ post:
+ tags:
+ - invoices
+ summary: "Bulk invoice actions"
+ description: |
+ There are multiple actions that are available including:
+
+ operationId: bulkInvoices
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/index"
+ requestBody:
+ description: "Bulk action details"
+ required: true
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ action:
+ type: string
+ description: |
+ The action to be performed, options include:
+ - `bulk_download`
+ Bulk download an array of invoice PDFs (These are sent to the admin via email.)
+ - `download`
+ Download a single PDF. (Returns a single PDF object)
+ - `bulk_print`
+ Merges an array of Invoice PDFs for easy one click printing.
+ - `auto_bill`
+ Attempts to automatically bill the invoices with the payment method on file.
+ - `clone_to_invoice`
+ Returns a clone of the invoice.
+ - `clone_to_quote`
+ Returns a quote cloned using the properties of the given invoice.
+ - `mark_paid`
+ Marks an array of invoices as paid.
+ - `mark_sent`
+ Marks an array of invoices as sent.
+ - `restore`
+ Restores an array of invoices
+ - `delete`
+ Deletes an array of invoices
+ - `archive`
+ Archives an array of invoices
+ - `cancel`
+ Cancels an array of invoices
+ - `email`
+ Emails an array of invoices
+ - `send_email`
+ Emails an array of invoices. Requires additional properties to be sent. `email_type`
+ ids:
+ type: array
+ items:
+ description: "Array of hashed IDs to be bulk 'actioned - ['D2J234DFA','D2J234DFA','D2J234DFA']"
+ type: string
+ example:
+ action: bulk_download
+ ids: "['D2J234DFA','D2J234DFA','D2J234DFA']"
+
+ responses:
+ 200:
+ description: "The Bulk Action response"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+
+ "/api/v1/invoices/{id}/{action}":
+ get:
+ deprecated: true
+ tags:
+ - invoices
+ summary: "Custom invoice action"
+ description: |
+ Performs a custom action on an invoice.
+ The current range of actions are as follows
+ - clone_to_invoice
+ - clone_to_quote
+ - history
+ - delivery_note
+ - mark_paid
+ - download
+ - archive
+ - delete
+ - email
+ operationId: actionInvoice
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Invoice Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ - name: action
+ in: path
+ description: "The action string to be performed"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: clone_to_quote
+ responses:
+ 200:
+ description: "Returns the invoice object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Invoice"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ "/api/v1/invoice/{invitation_key}/download":
+ get:
+ tags:
+ - invoices
+ summary: "Download invoice PDF"
+ description: "Downloads a specific invoice"
+ operationId: downloadInvoice
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: invitation_key
+ in: path
+ description: "The Invoice Invitation Key"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the invoice pdf"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ "/api/v1/invoices/{id}/delivery_note":
+ get:
+ tags:
+ - invoices
+ summary: "Download delivery note"
+ description: "Downloads a specific invoice delivery notes"
+ operationId: deliveryNote
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Invoice Hahsed Id"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the invoice delivery note pdf"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ "/api/v1/invoices/{id}/upload":
+ post:
+ tags:
+ - invoices
+ summary: "Add invoice document"
+ description: "Handles the uploading of a document to a invoice"
+ operationId: uploadInvoice
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Invoice Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ requestBody:
+ description: "File Upload Body"
+ required: true
+ content:
+ multipart/form-data:
+ schema:
+ type: object
+ properties:
+ _method:
+ type: string
+ example: PUT
+ documents:
+ type: array
+ items:
+ description: "Array of binary documents for upload"
+ type: string
+ format: binary
+ responses:
+ 200:
+ description: "Returns the Invoice object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Invoice"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ /api/v1/credits:
+ get:
+ tags:
+ - credits
+ summary: "List credits"
+ description: "Lists credits, search and filters allow fine grained lists to be generated.\n *\n * Query parameters can be added to performed more fine grained filtering of the credits, these are handled by the CreditFilters class which defines the methods available"
+ operationId: getCredits
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ responses:
+ 200:
+ description: "A list of credits"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ data:
+ type: array
+ items:
+ $ref: '#/components/schemas/Credit'
+ meta:
+ type: object
+ $ref: '#/components/schemas/Meta'
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ post:
+ tags:
+ - credits
+ summary: "Create credit"
+ description: "Adds an credit to the system"
+ operationId: storeCredit
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ responses:
+ 200:
+ description: "Returns the saved credit object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Credit"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+
+ "/api/v1/credits/{id}":
+ get:
+ tags:
+ - credits
+ summary: "Show credit"
+ description: "Displays an credit by id"
+ operationId: showCredit
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Credit Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the credit object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Credit"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ put:
+ tags:
+ - Credits
+ summary: "Update credit"
+ description: "Handles the updating of an Credit by id"
+ operationId: updateCredit
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Credit Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the Credit object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Credit"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ delete:
+ tags:
+ - credits
+ summary: "Delete credit"
+ description: "Handles the deletion of an credit by id"
+ operationId: deleteCredit
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Credit Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns a HTTP status"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ "/api/v1/credits/{id}/edit":
+ get:
+ tags:
+ - credits
+ summary: "Edit credit"
+ description: "Displays an credit by id"
+ operationId: editCredit
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Invoice Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the credit object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Invoice"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ /api/v1/credits/create:
+ get:
+ tags:
+ - credits
+ summary: "Blank credit"
+ description: "Returns a blank object with default values"
+ operationId: getCreditsCreate
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ responses:
+ 200:
+ description: "A blank credit object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Credit"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ /api/v1/credits/bulk:
+ post:
+ tags:
+ - credits
+ summary: "Bulk credit actions"
+ description: ""
+ operationId: bulkCredits
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/index"
+ requestBody:
+ description: "User credentials"
+ required: true
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ description: "Array of hashed IDs to be bulk 'actioned"
+ type: string
+ example: '[D2J234DFA,D2J234DFA,D2J234DFA]'
+ responses:
+ 200:
+ description: "The Bulk Action response"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ "/api/v1/credit/{invitation_key}/download":
+ get:
+ tags:
+ - quotes
+ summary: "Download quote PDF"
+ description: "Downloads a specific quote"
+ operationId: downloadCredit
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: invitation_key
+ in: path
+ description: "The Credit Invitation Key"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the credit pdf"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ "/api/v1/credits/{id}/upload":
+ post:
+ tags:
+ - credits
+ summary: "Upload a credit document"
+ description: "Handles the uploading of a document to a credit"
+ operationId: uploadCredits
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Credit Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ requestBody:
+ description: "File Upload Body"
+ required: true
+ content:
+ multipart/form-data:
+ schema:
+ type: object
+ properties:
+ _method:
+ type: string
+ example: PUT
+ documents:
+ type: array
+ items:
+ description: "Array of binary documents for upload"
+ type: string
+ format: binary
+ responses:
+ 200:
+ description: "Returns the Credit object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Credit"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
/api/v1/products:
get:
tags:
- products
summary: "List products"
description: |
- Lists products, search and filters allow fine grained lists to be generated.
+ Lists products, search and filters allow fine grained lists to be generated.
Query parameters can be added to perform fine grained filtering of the products list, these are handled by the ProductFilters class
which defines the methods available
operationId: getProducts
@@ -8547,7 +10174,7 @@ paths:
required: false
schema:
type: string
- example: id|desc product_key|desc
+ example: id|desc product_key|desc
responses:
200:
description: "A list of products"
@@ -8560,10 +10187,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/Product'
@@ -8949,3854 +10576,6 @@ paths:
default:
$ref: '#/components/responses/default'
- /api/v1/tasks:
- get:
- tags:
- - tasks
- summary: "List tasks"
- description: "Lists tasks, search and filters allow fine grained lists to be generated.\n *\n * Query parameters can be added to performed more fine grained filtering of the tasks, these are handled by the TaskFilters class which defines the methods available"
- operationId: getTasks
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - $ref: "#/components/parameters/index"
- responses:
- 200:
- description: "A list of tasks"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- type: object
- properties:
- data:
- type: array
- items:
- $ref: '#/components/schemas/Task'
- meta:
- type: object
- $ref: '#/components/schemas/Meta'
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- post:
- tags:
- - tasks
- summary: "Create task"
- description: "Adds an task to a company"
- operationId: storeTask
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- responses:
- 200:
- description: "Returns the saved task object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Task"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- "/api/v1/tasks/{id}":
- get:
- tags:
- - tasks
- summary: "Show task"
- description: "Displays a task by id"
- operationId: showTask
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Task Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the task object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Task"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- put:
- tags:
- - tasks
- summary: "Update task"
- description: "Handles the updating of a task by id"
- operationId: updateTask
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The task Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the task object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Task"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- delete:
- tags:
- - tasks
- summary: "Delete task"
- description: "Handles the deletion of a task by id"
- operationId: deleteTask
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Task Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns a HTTP status"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- "/api/v1/tasks/{id}/edit":
- get:
- tags:
- - tasks
- summary: "Edit task"
- description: "Displays a task by id"
- operationId: editTask
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Task Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the client object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Task"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- /api/v1/tasks/create:
- get:
- tags:
- - tasks
- summary: "Blank task"
- description: "Returns a blank task with default values"
- operationId: getTasksCreate
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- responses:
- 200:
- description: "A blank task object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Task"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- /api/v1/tasks/bulk:
- post:
- tags:
- - tasks
- summary: "Bulk task actions"
- description: ""
- operationId: bulkTasks
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/index"
- requestBody:
- description: "User credentials"
- required: true
- content:
- application/json:
- schema:
- type: array
- items:
- description: "Array of hashed IDs to be bulk 'actioned"
- type: integer
- example: "[0,1,2,3]"
- responses:
- 200:
- description: "The Task User response"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Task"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- "/api/v1/tasks/{id}/upload":
- post:
- tags:
- - tasks
- summary: "Uploads a task document"
- description: "Handles the uploading of a document to a task"
- operationId: uploadTask
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Task Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- requestBody:
- description: "File Upload Body"
- required: true
- content:
- multipart/form-data:
- schema:
- type: object
- properties:
- _method:
- type: string
- example: PUT
- documents:
- type: array
- items:
- description: "Array of binary documents for upload"
- type: string
- format: binary
- responses:
- 200:
- description: "Returns the Task object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Task"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- /api/v1/tasks/sort:
- post:
- tags:
- - tasks
- summary: "Sort tasks on KanBan"
- description: "Sorts tasks after drag and drop on the KanBan."
- operationId: sortTasks
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- responses:
- 200:
- description: "Returns an Ok, 200 HTTP status"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- /api/v1/projects:
- get:
- tags:
- - projects
- summary: "List projects"
- description: "Lists projects"
- operationId: getProjects
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - $ref: "#/components/parameters/index"
- responses:
- 200:
- description: "A list of projects"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- type: object
- properties:
- data:
- type: array
- items:
- $ref: '#/components/schemas/Project'
- meta:
- type: object
- $ref: '#/components/schemas/Meta'
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- post:
- tags:
- - projects
- summary: "Create project"
- description: "Adds an project to a company"
- operationId: storeProject
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- responses:
- 200:
- description: "Returns the saved project object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Project"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- "/api/v1/projects/{id}":
- get:
- tags:
- - projects
- summary: "Show project"
- description: "Displays a project by id"
- operationId: showProject
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Project Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the expense object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Project"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- put:
- tags:
- - projects
- summary: "Update project"
- description: "Handles the updating of a project by id"
- operationId: updateProject
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Project Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the project object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Project"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- delete:
- tags:
- - projects
- summary: "Delete project"
- description: "Handles the deletion of a project by id"
- operationId: deleteProject
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Project Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns a HTTP status"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- "/api/v1/projects/{id}/edit":
- get:
- tags:
- - projects
- summary: "Edit project"
- description: "Displays a project by id"
- operationId: editProject
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Project Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the project object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Project"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- /api/v1/projects/create:
- get:
- tags:
- - projects
- summary: "Blank project"
- description: "Returns a blank object with default values"
- operationId: getProjectsCreate
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- responses:
- 200:
- description: "A blank project object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Project"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- /api/v1/projects/bulk:
- post:
- tags:
- - projects
- summary: "Bulk project actions"
- description: ""
- operationId: bulkProjects
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/index"
- requestBody:
- description: "User credentials"
- required: true
- content:
- application/json:
- schema:
- type: array
- items:
- description: "Array of hashed IDs to be bulk 'actioned"
- type: integer
- example: "[0,1,2,3]"
- responses:
- 200:
- description: "The Project User response"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Project"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- "/api/v1/projects/{id}/upload":
- post:
- tags:
- - projects
- summary: "Uploads a project document"
- description: "Handles the uploading of a document to a project"
- operationId: uploadProject
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Project Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- requestBody:
- description: "File Upload Body"
- required: true
- content:
- multipart/form-data:
- schema:
- type: object
- properties:
- _method:
- type: string
- example: PUT
- documents:
- type: array
- items:
- description: "Array of binary documents for upload"
- type: string
- format: binary
- responses:
- 200:
- description: "Returns the Project object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Project"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- /api/v1/clients:
- get:
- tags:
- - clients
- summary: 'List clients'
- description: |
- When retrieving a list of clients you can also chain query parameters in order to filter the dataset that is returned. For example, you can send a request to the following URL to retrieve clients that have a balance greater than 1000:\
-
- ```
- /api/v1/clients?balance=gt:1000
- ```
-
- You can also sort the results by adding a sort parameter. The following example will sort the results by the client name in descending order:\
-
- ```
- /api/v1/clients?sort=name|desc
- ```
-
- You can also combine multiple filters together. The following example will return clients that have a balance greater than 1000 and are not deleted and have a name that starts with "Bob":\
-
- ```
- /api/v1/clients?balance=gt:1000&name=Bob*
- ```
-
- If you wish to retrieve child relations, you can also combine the query parameter `?include=` with a comma separated list of relationships:\
-
- ```
- /api/v1/clients?include=activities,ledger,system_logs'
- ```
-
- The per_page and page variables allow pagination of the list of clients. The following example will return the second page of clients with 15 clients per page:\
-
- ```
- /api/v1/clients?per_page=15&page=2
- ```
-
- The default per_page value is 20.
-
- operationId: getClients
- parameters:
- - $ref: '#/components/parameters/X-API-TOKEN'
- - $ref: '#/components/parameters/X-Requested-With'
- - $ref: '#/components/parameters/client_include'
- - $ref: '#/components/parameters/index'
- - $ref: "#/components/parameters/status"
- - $ref: "#/components/parameters/created_at"
- - $ref: "#/components/parameters/updated_at"
- - $ref: "#/components/parameters/is_deleted"
- - $ref: "#/components/parameters/filter_deleted_clients"
- - $ref: "#/components/parameters/vendor_id"
- - name: name
- in: query
- description: Filter by client name
- required: false
- schema:
- type: string
- example: bob
- - name: balance
- in: query
- description: Filter by client balance, format uses an operator and value separated by a colon. lt,lte, gt, gte, eq
- required: false
- schema:
- type: string
- example: lt:10
- - name: between_balance
- in: query
- description: Filter between client balances, format uses two values separated by a colon
- required: false
- schema:
- type: string
- example: 10:100
- - name: email
- in: query
- description: Filter by client email
- required: false
- schema:
- type: string
- example: bob@gmail.com
- - name: id_number
- in: query
- description: Filter by client id_number
- required: false
- schema:
- type: string
- example: a1039883
- - name: number
- in: query
- description: Filter by client number
- required: false
- schema:
- type: string
- example: a1039883
- - name: filter
- in: query
- description: Filters clients on columns - name, id_number, contact.first_name contact.last_name, contact.email, custom_value1-4
- required: false
- schema:
- type: string
- example: a1039883
- - name: sort
- in: query
- description: Returns the list sorted by column in ascending or descending order.
- required: false
- schema:
- type: string
- example: id|desc name|desc balance|asc
-
- responses:
- 200:
- description: 'A list of clients'
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
- X-RateLimit-Remaining:
- $ref: '#/components/headers/X-RateLimit-Remaining'
- X-RateLimit-Limit:
- $ref: '#/components/headers/X-RateLimit-Limit'
- content:
- application/json:
- schema:
- type: object
- properties:
- data:
- type: array
- items:
- $ref: '#/components/schemas/Client'
- example:
- $ref: '#/components/schemas/Client'
- meta:
- type: object
- $ref: '#/components/schemas/Meta'
- example:
- $ref: '#/components/schemas/Meta'
- 401:
- $ref: '#/components/responses/401'
- 403:
- $ref: '#/components/responses/403'
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- default:
- $ref: '#/components/responses/default'
- post:
- tags:
- - clients
- summary: 'Create client'
- description: |
- Adds a client to a company
-
- When creating (or updating) a client you must include the child contacts with all mutating requests. Client contacts cannot be modified in isolation.
-
- operationId: storeClient
- parameters:
- - $ref: '#/components/parameters/X-API-TOKEN'
- - $ref: '#/components/parameters/X-Requested-With'
- - $ref: '#/components/parameters/client_include'
- requestBody:
- description: Client object that needs to be added to the company
- required: true
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ClientRequest'
- responses:
- 200:
- description: 'Returns the saved client object'
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
- X-RateLimit-Remaining:
- $ref: '#/components/headers/X-RateLimit-Remaining'
- X-RateLimit-Limit:
- $ref: '#/components/headers/X-RateLimit-Limit'
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Client'
- 401:
- $ref: '#/components/responses/401'
- 403:
- $ref: '#/components/responses/403'
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- default:
- $ref: '#/components/responses/default'
- '/api/v1/clients/{id}':
- get:
- tags:
- - clients
- summary: 'Show client'
- description: 'Displays a client by id'
- operationId: showClient
- parameters:
- - $ref: '#/components/parameters/X-API-TOKEN'
- - $ref: '#/components/parameters/X-Requested-With'
- - $ref: '#/components/parameters/client_include'
- - name: id
- in: path
- description: 'The Client Hashed ID'
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: 'Returns the client object'
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
- X-RateLimit-Remaining:
- $ref: '#/components/headers/X-RateLimit-Remaining'
- X-RateLimit-Limit:
- $ref: '#/components/headers/X-RateLimit-Limit'
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Client'
- 401:
- $ref: '#/components/responses/401'
- 403:
- $ref: '#/components/responses/403'
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- default:
- $ref: '#/components/responses/default'
- put:
- tags:
- - clients
- summary: 'Update client'
- description: 'Handles the updating of a client by id'
- operationId: updateClient
- parameters:
- - $ref: '#/components/parameters/X-API-TOKEN'
- - $ref: '#/components/parameters/X-Requested-With'
- - $ref: '#/components/parameters/client_include'
- - name: id
- in: path
- description: 'The Client Hashed ID'
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- requestBody:
- description: Client object that needs to be updated
- required: true
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ClientRequest'
- responses:
- 200:
- description: 'Returns the client object'
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
- X-RateLimit-Remaining:
- $ref: '#/components/headers/X-RateLimit-Remaining'
- X-RateLimit-Limit:
- $ref: '#/components/headers/X-RateLimit-Limit'
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Client'
- 401:
- $ref: '#/components/responses/401'
- 403:
- $ref: '#/components/responses/403'
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- default:
- $ref: '#/components/responses/default'
- delete:
- tags:
- - clients
- summary: 'Delete client'
- description: 'Handles the deletion of a client by id'
- operationId: deleteClient
- parameters:
- - $ref: '#/components/parameters/X-API-TOKEN'
- - $ref: '#/components/parameters/X-Requested-With'
- - $ref: '#/components/parameters/client_include'
- - name: id
- in: path
- description: 'The Client Hashed ID'
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: 'Returns a HTTP status'
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
- X-RateLimit-Remaining:
- $ref: '#/components/headers/X-RateLimit-Remaining'
- X-RateLimit-Limit:
- $ref: '#/components/headers/X-RateLimit-Limit'
- 401:
- $ref: '#/components/responses/401'
- 403:
- $ref: '#/components/responses/403'
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- default:
- $ref: '#/components/responses/default'
- '/api/v1/clients/{id}/edit':
- get:
- tags:
- - clients
- summary: 'Edit Client'
- description: 'Displays a client by id, essentially an alias of the show route'
- operationId: editClient
- parameters:
- - $ref: '#/components/parameters/X-API-TOKEN'
- - $ref: '#/components/parameters/X-Requested-With'
- - $ref: '#/components/parameters/include'
- - name: id
- in: path
- description: 'The Client Hashed ID'
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: 'Returns the client object'
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
- X-RateLimit-Remaining:
- $ref: '#/components/headers/X-RateLimit-Remaining'
- X-RateLimit-Limit:
- $ref: '#/components/headers/X-RateLimit-Limit'
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Client'
- 401:
- $ref: '#/components/responses/401'
- 403:
- $ref: '#/components/responses/403'
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- default:
- $ref: '#/components/responses/default'
- /api/v1/clients/create:
- get:
- tags:
- - clients
- summary: 'Blank Client'
- description: 'Returns a blank object with default values'
- operationId: getClientsCreate
- parameters:
- - $ref: '#/components/parameters/X-API-TOKEN'
- - $ref: '#/components/parameters/X-Requested-With'
- - $ref: '#/components/parameters/client_include'
- responses:
- 200:
- description: 'A blank client object'
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
- X-RateLimit-Remaining:
- $ref: '#/components/headers/X-RateLimit-Remaining'
- X-RateLimit-Limit:
- $ref: '#/components/headers/X-RateLimit-Limit'
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Client'
- 401:
- $ref: '#/components/responses/401'
- 403:
- $ref: '#/components/responses/403'
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- default:
- $ref: '#/components/responses/default'
- /api/v1/clients/bulk:
- post:
- tags:
- - clients
- summary: 'Bulk client actions'
- description: 'Archive / Restore / Delete in bulk'
- operationId: bulkClients
- parameters:
- - $ref: '#/components/parameters/X-API-TOKEN'
- - $ref: '#/components/parameters/X-Requested-With'
- - $ref: '#/components/parameters/index'
- requestBody:
- description: 'Bulk action array'
- required: true
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/GenericBulkAction'
-
- responses:
- 200:
- description: 'The Client listresponse'
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
- X-RateLimit-Remaining:
- $ref: '#/components/headers/X-RateLimit-Remaining'
- X-RateLimit-Limit:
- $ref: '#/components/headers/X-RateLimit-Limit'
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Client'
- 401:
- $ref: '#/components/responses/401'
- 403:
- $ref: '#/components/responses/403'
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- default:
- $ref: '#/components/responses/default'
- '/api/v1/clients/{id}/upload':
- post:
- tags:
- - clients
- summary: 'Add client document'
- description: 'Handles the uploading of a document to a client, please note due to a quirk in REST you will need to use a _method parameter with value of POST'
- operationId: uploadClient
- parameters:
- - $ref: '#/components/parameters/X-API-TOKEN'
- - $ref: '#/components/parameters/X-Requested-With'
- - $ref: '#/components/parameters/client_include'
- - name: id
- in: path
- description: 'The Client Hashed ID'
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- requestBody:
- required: true
- content:
- multipart/form-data:
- schema:
- type: object
- properties:
- _method:
- type: string
- example: POST
- documents:
- type: array
- items:
- format: binary
- responses:
- 200:
- description: 'Returns the client object'
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
- X-RateLimit-Remaining:
- $ref: '#/components/headers/X-RateLimit-Remaining'
- X-RateLimit-Limit:
- $ref: '#/components/headers/X-RateLimit-Limit'
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Client'
- 401:
- $ref: '#/components/responses/401'
- 403:
- $ref: '#/components/responses/403'
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- default:
- $ref: '#/components/responses/default'
- '/api/v1/clients/{id}/purge':
- post:
- tags:
- - clients
- summary: 'Purge client'
- description: |
- Handles purging a clients.
-
- Please note this is a destructive action.
-
- This action will remove all data associated with the client and cannot be undone.
- operationId: purgeClient
- parameters:
- - $ref: '#/components/parameters/X-API-TOKEN'
- - $ref: '#/components/parameters/X-Requested-With'
- - $ref: '#/components/parameters/X-API-PASSWORD'
- - $ref: '#/components/parameters/client_include'
- - name: id
- in: path
- description: 'The Client Hashed ID'
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: 'Returns the client object'
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
- X-RateLimit-Remaining:
- $ref: '#/components/headers/X-RateLimit-Remaining'
- X-RateLimit-Limit:
- $ref: '#/components/headers/X-RateLimit-Limit'
- 401:
- $ref: '#/components/responses/401'
- 403:
- $ref: '#/components/responses/403'
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- default:
- $ref: '#/components/responses/default'
- '/api/v1/clients/{id}/{mergeable_client_hashed_id}/merge':
- post:
- tags:
- - clients
- summary: 'Merge client'
- description: |
- Handles merging 2 clients
-
- The id parameter is the client that will be the primary client after the merge has completed.
-
- The mergeable_client_hashed_id is the client that will be merged into the primary client, this clients records will be updated and associated with the primary client.
- operationId: mergeClient
- parameters:
- - $ref: '#/components/parameters/X-API-TOKEN'
- - $ref: '#/components/parameters/X-Requested-With'
- - $ref: '#/components/parameters/client_include'
- - $ref: '#/components/parameters/X-API-PASSWORD'
- - name: id
- in: path
- description: 'The Client Hashed ID'
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- - name: mergeable_client_hashed_id
- in: path
- description: 'The Mergeable Client Hashed ID'
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: 'Returns the client object'
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
- X-RateLimit-Remaining:
- $ref: '#/components/headers/X-RateLimit-Remaining'
- X-RateLimit-Limit:
- $ref: '#/components/headers/X-RateLimit-Limit'
- 401:
- $ref: '#/components/responses/401'
- 403:
- $ref: '#/components/responses/403'
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- default:
- $ref: '#/components/responses/default'
- /api/v1/client_statement:
- post:
- tags:
- - clients
- summary: 'Client statement PDF'
- description: 'Return a PDF of the client statement'
- operationId: clientStatement
- parameters:
- - $ref: '#/components/parameters/X-API-TOKEN'
- - $ref: '#/components/parameters/X-Requested-With'
- - $ref: '#/components/parameters/include'
- requestBody:
- description: 'Statement Options'
- required: true
- content:
- application/json:
- schema:
- properties:
- start_date:
- description: 'The start date of the statement period - format Y-m-d'
- type: string
- end_date:
- description: 'The start date of the statement period - format Y-m-d'
- type: string
- client_id:
- description: 'The hashed ID of the client'
- type: string
- show_payments_table:
- description: 'Flag which determines if the payments table is shown'
- type: boolean
- show_credits_table:
- description: 'Flag which determines if the credits table is shown'
- type: boolean
- show_aging_table:
- description: 'Flag which determines if the aging table is shown'
- type: boolean
- type: object
- responses:
- 200:
- description: 'Returns the client object'
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
- X-RateLimit-Remaining:
- $ref: '#/components/headers/X-RateLimit-Remaining'
- X-RateLimit-Limit:
- $ref: '#/components/headers/X-RateLimit-Limit'
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Client'
- 401:
- $ref: '#/components/responses/401'
- 403:
- $ref: '#/components/responses/403'
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: '#/components/responses/default'
- /api/v1/reactivate_email/{bounce_id}:
- post:
- tags:
- - clients
- summary: 'Removes email suppression of a user in the system'
- description: 'Emails are suppressed by PostMark, when they receive a Hard bounce / Spam Complaint. This endpoint allows you to remove the suppression and send emails to the user again.'
- operationId: reactivateEmail
- parameters:
- - $ref: '#/components/parameters/X-API-TOKEN'
- - $ref: '#/components/parameters/X-Requested-With'
- - $ref: '#/components/parameters/include'
- - name: bounce_id
- in: path
- description: 'The postmark Bounce ID reference'
- required: true
- schema:
- type: string
- format: string
- example: 123243
- responses:
- 200:
- description: 'Success'
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
- X-RateLimit-Remaining:
- $ref: '#/components/headers/X-RateLimit-Remaining'
- X-RateLimit-Limit:
- $ref: '#/components/headers/X-RateLimit-Limit'
- 400:
- description: 'Postmark exception - generated if the suppression cannot be removed for any reason'
- 401:
- $ref: '#/components/responses/401'
- 403:
- $ref: '#/components/responses/403'
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: '#/components/responses/default'
- /api/v1/clients/{client}/updateTaxData:
- post:
- tags:
- - clients
- summary: 'Update tax data'
- description: 'Updates the clients tax data - if their address has changed'
- operationId: updateClientTaxData
- parameters:
- - $ref: '#/components/parameters/X-API-TOKEN'
- - $ref: '#/components/parameters/X-Requested-With'
- - $ref: '#/components/parameters/include'
- - name: client
- in: path
- description: 'The Client Hashed ID reference'
- required: true
- schema:
- type: string
- format: string
- example: V2J234DFA
- responses:
- 200:
- description: 'Success'
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
- X-RateLimit-Remaining:
- $ref: '#/components/headers/X-RateLimit-Remaining'
- X-RateLimit-Limit:
- $ref: '#/components/headers/X-RateLimit-Limit'
- 400:
- description: 'Postmark exception - generated if the suppression cannot be removed for any reason'
- 401:
- $ref: '#/components/responses/401'
- 403:
- $ref: '#/components/responses/403'
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: '#/components/responses/default'
- /api/v1/credits:
- get:
- tags:
- - credits
- summary: "List credits"
- description: "Lists credits, search and filters allow fine grained lists to be generated.\n *\n * Query parameters can be added to performed more fine grained filtering of the credits, these are handled by the CreditFilters class which defines the methods available"
- operationId: getCredits
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- responses:
- 200:
- description: "A list of credits"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- type: object
- properties:
- data:
- type: array
- items:
- $ref: '#/components/schemas/Credit'
- meta:
- type: object
- $ref: '#/components/schemas/Meta'
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- post:
- tags:
- - credits
- summary: "Create credit"
- description: "Adds an credit to the system"
- operationId: storeCredit
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- responses:
- 200:
- description: "Returns the saved credit object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Credit"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
-
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
-
- "/api/v1/credits/{id}":
- get:
- tags:
- - credits
- summary: "Show credit"
- description: "Displays an credit by id"
- operationId: showCredit
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Credit Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the credit object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Credit"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
-
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- put:
- tags:
- - Credits
- summary: "Update credit"
- description: "Handles the updating of an Credit by id"
- operationId: updateCredit
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Credit Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the Credit object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Credit"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
-
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- delete:
- tags:
- - credits
- summary: "Delete credit"
- description: "Handles the deletion of an credit by id"
- operationId: deleteCredit
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Credit Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns a HTTP status"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
-
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- "/api/v1/credits/{id}/edit":
- get:
- tags:
- - credits
- summary: "Edit credit"
- description: "Displays an credit by id"
- operationId: editCredit
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Invoice Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the credit object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Invoice"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
-
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- /api/v1/credits/create:
- get:
- tags:
- - credits
- summary: "Blank credit"
- description: "Returns a blank object with default values"
- operationId: getCreditsCreate
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- responses:
- 200:
- description: "A blank credit object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Credit"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
-
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- /api/v1/credits/bulk:
- post:
- tags:
- - credits
- summary: "Bulk credit actions"
- description: ""
- operationId: bulkCredits
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/index"
- requestBody:
- description: "User credentials"
- required: true
- content:
- application/json:
- schema:
- type: array
- items:
- description: "Array of hashed IDs to be bulk 'actioned"
- type: string
- example: '[D2J234DFA,D2J234DFA,D2J234DFA]'
- responses:
- 200:
- description: "The Bulk Action response"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
-
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- "/api/v1/credit/{invitation_key}/download":
- get:
- tags:
- - quotes
- summary: "Download quote PDF"
- description: "Downloads a specific quote"
- operationId: downloadCredit
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: invitation_key
- in: path
- description: "The Credit Invitation Key"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the credit pdf"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
-
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- "/api/v1/credits/{id}/upload":
- post:
- tags:
- - credits
- summary: "Upload a credit document"
- description: "Handles the uploading of a document to a credit"
- operationId: uploadCredits
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Credit Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- requestBody:
- description: "File Upload Body"
- required: true
- content:
- multipart/form-data:
- schema:
- type: object
- properties:
- _method:
- type: string
- example: PUT
- documents:
- type: array
- items:
- description: "Array of binary documents for upload"
- type: string
- format: binary
- responses:
- 200:
- description: "Returns the Credit object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Credit"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- /api/v1/payments:
- get:
- tags:
- - payments
- summary: "List payments"
- description: "Lists payments, search and filters allow fine grained lists to be generated.\n\n Query parameters can be added to performed more fine grained filtering of the payments, these are handled by the PaymentFilters class which defines the methods available"
- operationId: getPayments
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - $ref: "#/components/parameters/status"
- - $ref: "#/components/parameters/client_id"
- - $ref: "#/components/parameters/created_at"
- - $ref: "#/components/parameters/updated_at"
- - $ref: "#/components/parameters/is_deleted"
- - $ref: "#/components/parameters/filter_deleted_clients"
- - $ref: "#/components/parameters/vendor_id"
- - name: filter
- in: query
- description: |
- Searches across a range of columns including:
- - amount
- - date
- - custom_value1
- - custom_value2
- - custom_value3
- - custom_value4
- required: false
- schema:
- type: string
- example: ?filter=10
- - name: number
- in: query
- description: |
- Search payments by payment number
- required: false
- schema:
- type: string
- example: ?number=0001
- - name: sort
- in: query
- description: Returns the list sorted by column in ascending or descending order.
- required: false
- schema:
- type: string
- example: id|desc number|desc balance|asc
- responses:
- 200:
- description: "A list of payments"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- type: object
- properties:
- data:
- type: array
- items:
- $ref: '#/components/schemas/Payment'
- meta:
- type: object
- $ref: '#/components/schemas/Meta'
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- post:
- tags:
- - payments
- summary: "Create payment"
- description: "Adds an Payment to the system"
- operationId: storePayment
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- requestBody:
- description: "The payment request"
- required: true
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Payment"
- responses:
- 200:
- description: "Returns the saved Payment object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Payment"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
-
- "/api/v1/payments/{id}":
- get:
- tags:
- - payments
- summary: "Show payment"
- description: "Displays an Payment by id"
- operationId: showPayment
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Payment Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the Payment object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Payment"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- put:
- tags:
- - payments
- summary: "Update payment"
- description: "Handles the updating of an Payment by id"
- operationId: updatePayment
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Payment Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the Payment object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Payment"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- delete:
- tags:
- - payments
- summary: "Delete payment"
- description: "Handles the deletion of an Payment by id"
- operationId: deletePayment
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Payment Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns a HTTP status"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- "/api/v1/payments/{id}/edit":
- get:
- tags:
- - payments
- summary: "Edit payment"
- description: "Displays an Payment by id"
- operationId: editPayment
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Payment Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the Payment object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Payment"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- /api/v1/payments/create:
- get:
- tags:
- - payments
- summary: "Blank payment"
- description: "Returns a blank object with default values"
- operationId: getPaymentsCreate
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- responses:
- 200:
- description: "A blank Payment object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Payment"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- /api/v1/payments/refund:
- post:
- tags:
- - payments
- summary: "Refund payment"
- description: "Adds an Refund to the system"
- operationId: storeRefund
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- requestBody:
- description: "The refund request"
- required: true
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Payment"
- responses:
- 200:
- description: "Returns the saved Payment object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Payment"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- /api/v1/payments/bulk:
- post:
- tags:
- - payments
- summary: "Bulk payment actions"
- description: ""
- operationId: bulkPayments
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/index"
- requestBody:
- description: "User credentials"
- required: true
- content:
- application/json:
- schema:
- type: array
- items:
- description: "Array of hashed IDs to be bulk 'actioned"
- type: integer
- example: "[0,1,2,3]"
- responses:
- 200:
- description: "The Payment response"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Payment"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- "/api/v1/payments/{id}/{action}":
- get:
- deprecated: true
- tags:
- - payments
- summary: "Custom payment actions"
- description: "Performs a custom action on an Payment.\n\n The current range of actions are as follows\n - clone_to_Payment\n - clone_to_quote\n - history\n - delivery_note\n - mark_paid\n - download\n - archive\n - delete\n - email"
- operationId: actionPayment
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Payment Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- - name: action
- in: path
- description: "The action string to be performed"
- required: true
- schema:
- type: string
- format: string
- example: clone_to_quote
- responses:
- 200:
- description: "Returns the Payment object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Payment"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
-
- "/api/v1/payments/{id}/upload":
- post:
- tags:
- - payments
- summary: "Upload a payment document"
- description: "Handles the uploading of a document to a payment"
- operationId: uploadPayment
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Payment Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- requestBody:
- description: "File Upload Body"
- required: true
- content:
- multipart/form-data:
- schema:
- type: object
- properties:
- _method:
- type: string
- example: PUT
- documents:
- type: array
- items:
- description: "Array of binary documents for upload"
- type: string
- format: binary
- responses:
- 200:
- description: "Returns the Payment object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Payment"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- /api/v1/invoices:
- get:
- tags:
- - invoices
- summary: "List invoices"
- description: |
- Lists invoices with the option to chain multiple query parameters allowing fine grained filtering of the list.
-
- operationId: getInvoices
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - $ref: "#/components/parameters/status"
- - $ref: "#/components/parameters/client_id"
- - $ref: "#/components/parameters/created_at"
- - $ref: "#/components/parameters/updated_at"
- - $ref: "#/components/parameters/is_deleted"
- - $ref: "#/components/parameters/filter_deleted_clients"
- - $ref: "#/components/parameters/vendor_id"
- - name: client_status
- in: query
- description: |
- A comma separated list of invoice status strings. Valid options include:
- - all
- - paid
- - unpaid
- - overdue
- required: false
- schema:
- type: string
- example: ?client_status=paid,unpaid
- - name: number
- in: query
- description: |
- Search invoices by invoice number
- required: false
- schema:
- type: string
- example: ?number=INV-001
- - name: filter
- in: query
- description: |
- Searches across a range of columns including:
- - number
- - po_number
- - date
- - amount
- - balance
- - custom_value1
- - custom_value2
- - custom_value3
- - custom_value4
- required: false
- schema:
- type: string
- example: ?filter=bob
- - name: without_deleted_clients
- in: query
- description: |
- Returns the invoice list without the invoices of deleted clients.
- required: false
- schema:
- type: string
- example: ?without_deleted_clients=
- - name: overdue
- in: query
- description: |
- Returns the list of invoices that are overdue
- required: false
- schema:
- type: string
- example: ?over_due=
- - name: payable
- in: query
- description: |
- Returns the invoice list that are payable for a defined client. Please note, you must pass the client_id as the value for this query parameter
- required: false
- schema:
- type: string
- example: ?payable={client_id}
- - name: sort
- in: query
- description: Returns the list sorted by column in ascending or descending order.
- required: false
- schema:
- type: string
- example: id|desc number|desc balance|asc
- - name: private_notes
- in: query
- description: |
- Searches on the private_notes field of the invoices
- required: false
- schema:
- type: string
- example: ?private_notes=super secret
- responses:
- 200:
- description: "A list of invoices"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- type: object
- properties:
- data:
- type: array
- items:
- $ref: '#/components/schemas/Invoice'
- meta:
- type: object
- $ref: '#/components/schemas/Meta'
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- post:
- tags:
- - invoices
- summary: "Create invoice"
- description: |
- Adds a invoice to a company
-
- Triggered actions are available when updating or creating an invoice.
- These are query parameters that can be chained in order to perform additional actions on the entity, these include:
-
- ```
- ?send_email=true [Saves and sends the invoice]
- ?mark_sent=true [Saves and marks the invoice as sent]
- ?paid=true [Saves and marks the invoice as paid]
- ?amount_paid=100 [Saves and marks the invoice as paid with the given amount]
- ?cancel=true [Saves and marks the invoice as cancelled]
- ?save_default_footer=true [Saves the current footer as the default footer]
- ?save_default_terms=true [Saves the current terms as the default terms]
- ```
-
- operationId: storeInvoice
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- requestBody:
- required: true
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/InvoiceRequest"
- responses:
- 200:
- description: "Returns the saved invoice entity"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Invoice"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
-
- "/api/v1/invoices/{id}":
- get:
- tags:
- - invoices
- summary: "Show invoice"
- description: "Displays an invoice by id"
- operationId: showInvoice
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Invoice Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the invoice object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Invoice"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
-
- put:
- tags:
- - invoices
- summary: "Update invoice"
- description: |
- Handles the updating of an invoice by id.
-
- Triggered actions are available when updating or creating an invoice.
- These are query parameters that can be chained in order to perform additional actions on the entity, these include:
-
- ```
- ?send_email=true [Saves and sends the invoice]
- ?mark_sent=true [Saves and marks the invoice as sent]
- ?paid=true [Saves and marks the invoice as paid]
- ?amount_paid=100 [Saves and marks the invoice as paid with the given amount]
- ?cancel=true [Saves and marks the invoice as cancelled]
- ?save_default_footer=true [Saves the current footer as the default footer]
- ?save_default_terms=true [Saves the current terms as the default terms]
- ```
-
- operationId: updateInvoice
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Invoice Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the invoice object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Invoice"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- delete:
- tags:
- - invoices
- summary: "Delete invoice"
- description: "Handles the deletion of an invoice by id"
- operationId: deleteInvoice
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Invoice Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns a HTTP status"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- "/api/v1/invoices/{id}/edit":
- get:
- tags:
- - invoices
- summary: "Edit invoice"
- description: "Displays an invoice by id for editting"
- operationId: editInvoice
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Invoice Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the invoice object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Invoice"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
-
- /api/v1/invoices/create:
- get:
- tags:
- - invoices
- summary: "Blank invoice"
- description: "Returns a blank object with default values"
- operationId: getInvoicesCreate
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- responses:
- 200:
- description: "A blank invoice object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Invoice"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
-
- /api/v1/invoices/bulk:
- post:
- tags:
- - invoices
- summary: "Bulk invoice actions"
- description: |
- There are multiple actions that are available including:
-
- operationId: bulkInvoices
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/index"
- requestBody:
- description: "Bulk action details"
- required: true
- content:
- application/json:
- schema:
- type: object
- properties:
- action:
- type: string
- description: |
- The action to be performed, options include:
- - `bulk_download`
- Bulk download an array of invoice PDFs (These are sent to the admin via email.)
- - `download`
- Download a single PDF. (Returns a single PDF object)
- - `bulk_print`
- Merges an array of Invoice PDFs for easy one click printing.
- - `auto_bill`
- Attempts to automatically bill the invoices with the payment method on file.
- - `clone_to_invoice`
- Returns a clone of the invoice.
- - `clone_to_quote`
- Returns a quote cloned using the properties of the given invoice.
- - `mark_paid`
- Marks an array of invoices as paid.
- - `mark_sent`
- Marks an array of invoices as sent.
- - `restore`
- Restores an array of invoices
- - `delete`
- Deletes an array of invoices
- - `archive`
- Archives an array of invoices
- - `cancel`
- Cancels an array of invoices
- - `email`
- Emails an array of invoices
- - `send_email`
- Emails an array of invoices. Requires additional properties to be sent. `email_type`
- ids:
- type: array
- items:
- description: "Array of hashed IDs to be bulk 'actioned - ['D2J234DFA','D2J234DFA','D2J234DFA']"
- type: string
- example:
- action: bulk_download
- ids: "['D2J234DFA','D2J234DFA','D2J234DFA']"
-
- responses:
- 200:
- description: "The Bulk Action response"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
-
- "/api/v1/invoices/{id}/{action}":
- get:
- deprecated: true
- tags:
- - invoices
- summary: "Custom invoice action"
- description: |
- Performs a custom action on an invoice.
- The current range of actions are as follows
- - clone_to_invoice
- - clone_to_quote
- - history
- - delivery_note
- - mark_paid
- - download
- - archive
- - delete
- - email
- operationId: actionInvoice
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Invoice Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- - name: action
- in: path
- description: "The action string to be performed"
- required: true
- schema:
- type: string
- format: string
- example: clone_to_quote
- responses:
- 200:
- description: "Returns the invoice object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Invoice"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- "/api/v1/invoice/{invitation_key}/download":
- get:
- tags:
- - invoices
- summary: "Download invoice PDF"
- description: "Downloads a specific invoice"
- operationId: downloadInvoice
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: invitation_key
- in: path
- description: "The Invoice Invitation Key"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the invoice pdf"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- "/api/v1/invoices/{id}/delivery_note":
- get:
- tags:
- - invoices
- summary: "Download delivery note"
- description: "Downloads a specific invoice delivery notes"
- operationId: deliveryNote
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Invoice Hahsed Id"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the invoice delivery note pdf"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- "/api/v1/invoices/{id}/upload":
- post:
- tags:
- - invoices
- summary: "Add invoice document"
- description: "Handles the uploading of a document to a invoice"
- operationId: uploadInvoice
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Invoice Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- requestBody:
- description: "File Upload Body"
- required: true
- content:
- multipart/form-data:
- schema:
- type: object
- properties:
- _method:
- type: string
- example: PUT
- documents:
- type: array
- items:
- description: "Array of binary documents for upload"
- type: string
- format: binary
- responses:
- 200:
- description: "Returns the Invoice object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Invoice"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- /api/v1/recurring_invoices:
- get:
- tags:
- - Recurring Invoices
- summary: "List recurring invoices"
- description: |
- Lists invoices with the option to chain multiple query parameters allowing fine grained filtering of the list.
-
- operationId: getRecurringInvoices
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - $ref: "#/components/parameters/client_id"
- - $ref: "#/components/parameters/created_at"
- - $ref: "#/components/parameters/updated_at"
- - $ref: "#/components/parameters/is_deleted"
- - $ref: "#/components/parameters/filter_deleted_clients"
- - $ref: "#/components/parameters/vendor_id"
- - name: filter
- in: query
- description: |
- Searches across a range of columns including:
- - custom_value1
- - custom_value2
- - custom_value3
- - custom_value4
- required: false
- schema:
- type: string
- example: ?filter=bob
- - name: client_status
- in: query
- description: |
- A comma separated list of invoice status strings. Valid options include:
- - all
- - active
- - paused
- - completed
- required: false
- schema:
- type: string
- example: ?client_status=active,paused
- - name: sort
- in: query
- description: Returns the list sorted by column in ascending or descending order.
- required: false
- schema:
- type: string
- example: id|desc number|desc balance|asc
- responses:
- 200:
- description: "A list of recurring_invoices"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- type: object
- properties:
- data:
- type: array
- items:
- $ref: '#/components/schemas/RecurringInvoice'
- meta:
- type: object
- $ref: '#/components/schemas/Meta'
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- post:
- tags:
- - Recurring Invoices
- summary: "Create recurring invoice"
- description: "Adds a Recurring Invoice to the system"
- operationId: storeRecurringInvoice
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- responses:
- 200:
- description: "Returns the saved RecurringInvoice object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/RecurringInvoice"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
-
- "/api/v1/recurring_invoices/{id}":
- get:
- tags:
- - Recurring Invoices
- summary: "Show recurring invoice"
- description: "Displays an RecurringInvoice by id"
- operationId: showRecurringInvoice
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The RecurringInvoice Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the RecurringInvoice object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/RecurringInvoice"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- put:
- tags:
- - Recurring Invoices
- summary: "Update recurring invoice"
- description: "Handles the updating of an RecurringInvoice by id"
- operationId: updateRecurringInvoice
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The RecurringInvoice Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the RecurringInvoice object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/RecurringInvoice"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- delete:
- tags:
- - Recurring Invoices
- summary: "Delete recurring invoice"
- description: "Handles the deletion of an RecurringInvoice by id"
- operationId: deleteRecurringInvoice
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The RecurringInvoice Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns a HTTP status"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- "/api/v1/recurring_invoices/{id}/edit":
- get:
- tags:
- - Recurring Invoices
- summary: "Edit recurring invoice"
- description: "Displays an RecurringInvoice by id"
- operationId: editRecurringInvoice
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The RecurringInvoice Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the RecurringInvoice object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/RecurringInvoice"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
-
- /api/v1/recurring_invoices/create:
- get:
- tags:
- - Recurring Invoices
- summary: "Blank recurring invoice"
- description: "Returns a blank object with default values"
- operationId: getRecurringInvoicesCreate
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- responses:
- 200:
- description: "A blank RecurringInvoice object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/RecurringInvoice"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- /api/v1/recurring_invoices/bulk:
- post:
- tags:
- - Recurring Invoices
- summary: "Bulk recurring invoice actions"
- description: |
- There are multiple actions that are available including:
-
- operationId: bulkRecurringInvoices
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/index"
- requestBody:
- description: "Bulk action details"
- required: true
- content:
- application/json:
- schema:
- type: object
- properties:
- action:
- type: string
- description: |
- The action to be performed, options include:
- - `start`
- Starts (or restarts) the recurring invoice. **note** if the recurring invoice has been stopped for a long time, it will attempt to catch back up firing a new Invoice every hour per interval that has been missed.
- If you do not wish to have the recurring invoice catch up, you should set the next_send_date to the correct date you wish the recurring invoice to commence from.
- - `stop`
- Stops the recurring invoice.
- - `send_now`
- Force sends the recurring invoice - this option is only available when the recurring invoice is in a draft state.
- - `restore`
- Restores the recurring invoice from an archived or deleted state.
- - `archive`
- Archives the recurring invoice. The recurring invoice will not fire in this state.
- - `delete`
- Deletes a recurring invoice.
- ids:
- type: array
- items:
- description: "Array of hashed IDs to be bulk 'actioned - ['D2J234DFA','D2J234DFA','D2J234DFA']"
- type: string
- example:
- action: start
- ids: "['D2J234DFA','D2J234DFA','D2J234DFA']"
- responses:
- 200:
- description: "The RecurringInvoice response"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/RecurringInvoice"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- "/api/v1/recurring_invoices/{id}/{action}":
- get:
- deprecated: true
- tags:
- - Recurring Invoices
- summary: "Custom recurring invoice action"
- description: "Performs a custom action on an RecurringInvoice.\n\n The current range of actions are as follows\n - clone_to_RecurringInvoice\n - clone_to_quote\n - history\n - delivery_note\n - mark_paid\n - download\n - archive\n - delete\n - email"
- operationId: actionRecurringInvoice
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The RecurringInvoice Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- - name: action
- in: path
- description: "The action string to be performed"
- required: true
- schema:
- type: string
- format: string
- example: clone_to_quote
- responses:
- 200:
- description: "Returns the RecurringInvoice object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/RecurringInvoice"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- "/api/v1/recurring_invoice/{invitation_key}/download":
- get:
- tags:
- - Recurring Invoices
- summary: "Download recurring invoice PDF"
- description: "Downloads a specific invoice"
- operationId: downloadRecurringInvoice
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: invitation_key
- in: path
- description: "The Recurring Invoice Invitation Key"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the recurring invoice pdf"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
- "/api/v1/recurring_invoices/{id}/upload":
- post:
- tags:
- - Recurring Invoices
- summary: "Add recurring invoice document"
- description: "Handles the uploading of a document to a recurring_invoice"
- operationId: uploadRecurringInvoice
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The RecurringInvoice Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- requestBody:
- description: "File Upload Body"
- required: true
- content:
- multipart/form-data:
- schema:
- type: object
- properties:
- _method:
- type: string
- example: PUT
- documents:
- type: array
- items:
- description: "Array of binary documents for upload"
- type: string
- format: binary
- responses:
- 200:
- description: "Returns the RecurringInvoice object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/RecurringInvoice"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
- 422:
- $ref: '#/components/responses/422'
- 429:
- $ref: '#/components/responses/429'
- 5XX:
- description: 'Server error'
- default:
- $ref: "#/components/responses/default"
/api/v1/quotes:
get:
tags:
@@ -12818,11 +10597,11 @@ paths:
- name: filter
in: query
description: |
- Searches across a range of columns including:
- - number
- - custom_value1
- - custom_value2
- - custom_value3
+ Searches across a range of columns including:
+ - number
+ - custom_value1
+ - custom_value2
+ - custom_value3
- custom_value4
required: false
schema:
@@ -12831,13 +10610,13 @@ paths:
- name: client_status
in: query
description: |
- A comma separated list of quote status strings. Valid options include:
+ A comma separated list of quote status strings. Valid options include:
- all
- - draft
- - sent
+ - draft
+ - sent
- approved
- expired
- - upcoming
+ - upcoming
required: false
schema:
type: string
@@ -12845,7 +10624,7 @@ paths:
- name: number
in: query
description: |
- Search quote by quote number
+ Search quote by quote number
required: false
schema:
type: string
@@ -12856,7 +10635,7 @@ paths:
required: false
schema:
type: string
- example: id|desc number|desc balance|asc
+ example: id|desc number|desc balance|asc
responses:
200:
description: "A list of quotes"
@@ -12869,10 +10648,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/Quote'
@@ -13366,10 +11145,10 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
$ref: '#/components/schemas/PurchaseOrder'
@@ -13424,7 +11203,7 @@ paths:
description: 'Server error'
default:
$ref: "#/components/responses/default"
-
+
"/api/v1/purchase_orders/{id}":
get:
tags:
@@ -13600,7 +11379,7 @@ paths:
description: 'Server error'
default:
$ref: "#/components/responses/default"
-
+
/api/v1/purchase_orders/create:
get:
tags:
@@ -13839,13 +11618,13 @@ paths:
description: 'Server error'
default:
$ref: "#/components/responses/default"
- /api/v1/vendors:
+ /api/v1/tasks:
get:
tags:
- - vendors
- summary: "List vendors"
- description: "Lists vendors, search and filters allow fine grained lists to be generated.\n\n Query parameters can be added to performed more fine grained filtering of the vendors, these are handled by the VendorFilters class which defines the methods available"
- operationId: getVendors
+ - tasks
+ summary: "List tasks"
+ description: "Lists tasks, search and filters allow fine grained lists to be generated.\n *\n * Query parameters can be added to performed more fine grained filtering of the tasks, these are handled by the TaskFilters class which defines the methods available"
+ operationId: getTasks
parameters:
- $ref: "#/components/parameters/X-API-TOKEN"
- $ref: "#/components/parameters/X-Requested-With"
@@ -13853,7 +11632,7 @@ paths:
- $ref: "#/components/parameters/index"
responses:
200:
- description: "A list of vendors"
+ description: "A list of tasks"
headers:
X-MINIMUM-CLIENT-VERSION:
$ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
@@ -13863,13 +11642,13 @@ paths:
$ref: "#/components/headers/X-RateLimit-Limit"
content:
application/json:
- schema:
+ schema:
type: object
properties:
- data:
+ data:
type: array
items:
- $ref: '#/components/schemas/Vendor'
+ $ref: '#/components/schemas/Task'
meta:
type: object
$ref: '#/components/schemas/Meta'
@@ -13887,17 +11666,17 @@ paths:
$ref: "#/components/responses/default"
post:
tags:
- - vendors
- summary: "Create vendor"
- description: "Adds a vendor to a company"
- operationId: storeVendor
+ - tasks
+ summary: "Create task"
+ description: "Adds an task to a company"
+ operationId: storeTask
parameters:
- $ref: "#/components/parameters/X-API-TOKEN"
- $ref: "#/components/parameters/X-Requested-With"
- $ref: "#/components/parameters/include"
responses:
200:
- description: "Returns the saved clivendorent object"
+ description: "Returns the saved task object"
headers:
X-MINIMUM-CLIENT-VERSION:
$ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
@@ -13908,7 +11687,7 @@ paths:
content:
application/json:
schema:
- $ref: "#/components/schemas/Vendor"
+ $ref: "#/components/schemas/Task"
401:
$ref: "#/components/responses/401"
403:
@@ -13921,20 +11700,20 @@ paths:
description: 'Server error'
default:
$ref: "#/components/responses/default"
- "/api/v1/vendors/{id}":
+ "/api/v1/tasks/{id}":
get:
tags:
- - vendors
- summary: "Show vendor"
- description: "Displays a vendor by id"
- operationId: showVendor
+ - tasks
+ summary: "Show task"
+ description: "Displays a task by id"
+ operationId: showTask
parameters:
- $ref: "#/components/parameters/X-API-TOKEN"
- $ref: "#/components/parameters/X-Requested-With"
- $ref: "#/components/parameters/include"
- name: id
in: path
- description: "The vendor Hashed ID"
+ description: "The Task Hashed ID"
required: true
schema:
type: string
@@ -13942,7 +11721,7 @@ paths:
example: D2J234DFA
responses:
200:
- description: "Returns the vendor object"
+ description: "Returns the task object"
headers:
X-MINIMUM-CLIENT-VERSION:
$ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
@@ -13953,7 +11732,7 @@ paths:
content:
application/json:
schema:
- $ref: "#/components/schemas/Vendor"
+ $ref: "#/components/schemas/Task"
401:
$ref: "#/components/responses/401"
403:
@@ -13968,17 +11747,17 @@ paths:
$ref: "#/components/responses/default"
put:
tags:
- - vendors
- summary: "Update vendor"
- description: "Handles the updating of a vendor by id"
- operationId: updateVendor
+ - tasks
+ summary: "Update task"
+ description: "Handles the updating of a task by id"
+ operationId: updateTask
parameters:
- $ref: "#/components/parameters/X-API-TOKEN"
- $ref: "#/components/parameters/X-Requested-With"
- $ref: "#/components/parameters/include"
- name: id
in: path
- description: "The Vendor Hashed ID"
+ description: "The task Hashed ID"
required: true
schema:
type: string
@@ -13986,7 +11765,7 @@ paths:
example: D2J234DFA
responses:
200:
- description: "Returns the vendor object"
+ description: "Returns the task object"
headers:
X-MINIMUM-CLIENT-VERSION:
$ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
@@ -13997,7 +11776,7 @@ paths:
content:
application/json:
schema:
- $ref: "#/components/schemas/Vendor"
+ $ref: "#/components/schemas/Task"
401:
$ref: "#/components/responses/401"
403:
@@ -14012,17 +11791,17 @@ paths:
$ref: "#/components/responses/default"
delete:
tags:
- - vendors
- summary: "Delete vendor"
- description: "Handles the deletion of a vendor by id"
- operationId: deleteVendor
+ - tasks
+ summary: "Delete task"
+ description: "Handles the deletion of a task by id"
+ operationId: deleteTask
parameters:
- $ref: "#/components/parameters/X-API-TOKEN"
- $ref: "#/components/parameters/X-Requested-With"
- $ref: "#/components/parameters/include"
- name: id
in: path
- description: "The Vendor Hashed ID"
+ description: "The Task Hashed ID"
required: true
schema:
type: string
@@ -14050,20 +11829,20 @@ paths:
description: 'Server error'
default:
$ref: "#/components/responses/default"
- "/api/v1/vendors/{id}/edit":
+ "/api/v1/tasks/{id}/edit":
get:
tags:
- - vendors
- summary: "Edit vendor"
- description: "Displays a vendor by id"
- operationId: editVendor
+ - tasks
+ summary: "Edit task"
+ description: "Displays a task by id"
+ operationId: editTask
parameters:
- $ref: "#/components/parameters/X-API-TOKEN"
- $ref: "#/components/parameters/X-Requested-With"
- $ref: "#/components/parameters/include"
- name: id
in: path
- description: "The Vendor Hashed ID"
+ description: "The Task Hashed ID"
required: true
schema:
type: string
@@ -14071,7 +11850,7 @@ paths:
example: D2J234DFA
responses:
200:
- description: "Returns the vendor object"
+ description: "Returns the client object"
headers:
X-MINIMUM-CLIENT-VERSION:
$ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
@@ -14082,7 +11861,7 @@ paths:
content:
application/json:
schema:
- $ref: "#/components/schemas/Vendor"
+ $ref: "#/components/schemas/Task"
401:
$ref: "#/components/responses/401"
403:
@@ -14095,20 +11874,20 @@ paths:
description: 'Server error'
default:
$ref: "#/components/responses/default"
- /api/v1/vendors/create:
+ /api/v1/tasks/create:
get:
tags:
- - vendors
- summary: "Blank vendor"
- description: "Returns a blank vendor with default values"
- operationId: getVendorsCreate
+ - tasks
+ summary: "Blank task"
+ description: "Returns a blank task with default values"
+ operationId: getTasksCreate
parameters:
- $ref: "#/components/parameters/X-API-TOKEN"
- $ref: "#/components/parameters/X-Requested-With"
- $ref: "#/components/parameters/include"
responses:
200:
- description: "A blank vendor object"
+ description: "A blank task object"
headers:
X-MINIMUM-CLIENT-VERSION:
$ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
@@ -14119,7 +11898,7 @@ paths:
content:
application/json:
schema:
- $ref: "#/components/schemas/Vendor"
+ $ref: "#/components/schemas/Task"
401:
$ref: "#/components/responses/401"
403:
@@ -14132,13 +11911,13 @@ paths:
description: 'Server error'
default:
$ref: "#/components/responses/default"
- /api/v1/vendors/bulk:
+ /api/v1/tasks/bulk:
post:
tags:
- - vendors
- summary: "Bulk vendor actions"
+ - tasks
+ summary: "Bulk task actions"
description: ""
- operationId: bulkVendors
+ operationId: bulkTasks
parameters:
- $ref: "#/components/parameters/X-API-TOKEN"
- $ref: "#/components/parameters/X-Requested-With"
@@ -14156,7 +11935,7 @@ paths:
example: "[0,1,2,3]"
responses:
200:
- description: "The Vendor User response"
+ description: "The Task User response"
headers:
X-MINIMUM-CLIENT-VERSION:
$ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
@@ -14167,7 +11946,7 @@ paths:
content:
application/json:
schema:
- $ref: "#/components/schemas/Vendor"
+ $ref: "#/components/schemas/Task"
401:
$ref: "#/components/responses/401"
403:
@@ -14180,20 +11959,20 @@ paths:
description: 'Server error'
default:
$ref: "#/components/responses/default"
- "/api/v1/vendors/{id}/upload":
+ "/api/v1/tasks/{id}/upload":
post:
tags:
- - vendors
- summary: "Uploads a vendor document"
- description: "Handles the uploading of a document to a vendor"
- operationId: uploadVendor
+ - tasks
+ summary: "Uploads a task document"
+ description: "Handles the uploading of a document to a task"
+ operationId: uploadTask
parameters:
- $ref: "#/components/parameters/X-API-TOKEN"
- $ref: "#/components/parameters/X-Requested-With"
- $ref: "#/components/parameters/include"
- name: id
in: path
- description: "The Vendor Hashed ID"
+ description: "The Task Hashed ID"
required: true
schema:
type: string
@@ -14218,7 +11997,7 @@ paths:
format: binary
responses:
200:
- description: "Returns the Vendor object"
+ description: "Returns the Task object"
headers:
X-MINIMUM-CLIENT-VERSION:
$ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
@@ -14229,7 +12008,2304 @@ paths:
content:
application/json:
schema:
- $ref: "#/components/schemas/Vendor"
+ $ref: "#/components/schemas/Task"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ /api/v1/tasks/sort:
+ post:
+ tags:
+ - tasks
+ summary: "Sort tasks on KanBan"
+ description: "Sorts tasks after drag and drop on the KanBan."
+ operationId: sortTasks
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ responses:
+ 200:
+ description: "Returns an Ok, 200 HTTP status"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ /api/v1/clients:
+ get:
+ tags:
+ - clients
+ summary: 'List clients'
+ x-code-samples:
+ - lang: go
+ label: php
+ source: |
+ $ninja = new InvoiceNinja("your_token");
+ $invoices = $ninja->clients->all();
+ x-custom-element:
+ type: markdown
+ value: |
+ ### Custom Response Description
+ This is a custom description for the response returned by the `/example` endpoint.
+ description: |
+ When retrieving a list of clients you can also chain query parameters in order to filter the dataset that is returned. For example, you can send a request to the following URL to retrieve clients that have a balance greater than 1000:\
+
+ ```
+ /api/v1/clients?balance=gt:1000
+ ```
+
+ You can also sort the results by adding a sort parameter. The following example will sort the results by the client name in descending order:\
+
+ ```
+ /api/v1/clients?sort=name|desc
+ ```
+
+ You can also combine multiple filters together. The following example will return clients that have a balance greater than 1000 and are not deleted and have a name that starts with "Bob":\
+
+ ```
+ /api/v1/clients?balance=gt:1000&name=Bob*
+ ```
+
+ If you wish to retrieve child relations, you can also combine the query parameter `?include=` with a comma separated list of relationships:\
+
+ ```
+ /api/v1/clients?include=activities,ledger,system_logs'
+ ```
+
+ The per_page and page variables allow pagination of the list of clients. The following example will return the second page of clients with 15 clients per page:\
+
+ ```
+ /api/v1/clients?per_page=15&page=2
+ ```
+
+ The default per_page value is 20.
+
+ operationId: getClients
+ parameters:
+ - $ref: '#/components/parameters/X-API-TOKEN'
+ - $ref: '#/components/parameters/X-Requested-With'
+ - $ref: '#/components/parameters/client_include'
+ - $ref: '#/components/parameters/index'
+ - $ref: "#/components/parameters/status"
+ - $ref: "#/components/parameters/created_at"
+ - $ref: "#/components/parameters/updated_at"
+ - $ref: "#/components/parameters/is_deleted"
+ - $ref: "#/components/parameters/filter_deleted_clients"
+ - $ref: "#/components/parameters/vendor_id"
+ - name: name
+ in: query
+ description: Filter by client name
+ required: false
+ schema:
+ type: string
+ example: bob
+ - name: balance
+ in: query
+ description: Filter by client balance, format uses an operator and value separated by a colon. lt,lte, gt, gte, eq
+ required: false
+ schema:
+ type: string
+ example: lt:10
+ - name: between_balance
+ in: query
+ description: Filter between client balances, format uses two values separated by a colon
+ required: false
+ schema:
+ type: string
+ example: 10:100
+ - name: email
+ in: query
+ description: Filter by client email
+ required: false
+ schema:
+ type: string
+ example: bob@gmail.com
+ - name: id_number
+ in: query
+ description: Filter by client id_number
+ required: false
+ schema:
+ type: string
+ example: a1039883
+ - name: number
+ in: query
+ description: Filter by client number
+ required: false
+ schema:
+ type: string
+ example: a1039883
+ - name: filter
+ in: query
+ description: Filters clients on columns - name, id_number, contact.first_name contact.last_name, contact.email, custom_value1-4
+ required: false
+ schema:
+ type: string
+ example: a1039883
+ - name: sort
+ in: query
+ description: Returns the list sorted by column in ascending or descending order.
+ required: false
+ schema:
+ type: string
+ example: id|desc name|desc balance|asc
+
+ responses:
+ 200:
+ description: 'A list of clients'
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
+ X-RateLimit-Remaining:
+ $ref: '#/components/headers/X-RateLimit-Remaining'
+ X-RateLimit-Limit:
+ $ref: '#/components/headers/X-RateLimit-Limit'
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ data:
+ type: array
+ items:
+ $ref: '#/components/schemas/Client'
+ example:
+ $ref: '#/components/schemas/Client'
+ meta:
+ type: object
+ $ref: '#/components/schemas/Meta'
+ example:
+ $ref: '#/components/schemas/Meta'
+ 401:
+ $ref: '#/components/responses/401'
+ 403:
+ $ref: '#/components/responses/403'
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ default:
+ $ref: '#/components/responses/default'
+ post:
+ tags:
+ - clients
+ summary: 'Create client'
+ description: |
+ Adds a client to a company
+
+ When creating (or updating) a client you must include the child contacts with all mutating requests. Client contacts cannot be modified in isolation.
+
+ operationId: storeClient
+ parameters:
+ - $ref: '#/components/parameters/X-API-TOKEN'
+ - $ref: '#/components/parameters/X-Requested-With'
+ - $ref: '#/components/parameters/client_include'
+ requestBody:
+ description: Client object that needs to be added to the company
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ClientRequest'
+ responses:
+ 200:
+ description: 'Returns the saved client object'
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
+ X-RateLimit-Remaining:
+ $ref: '#/components/headers/X-RateLimit-Remaining'
+ X-RateLimit-Limit:
+ $ref: '#/components/headers/X-RateLimit-Limit'
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Client'
+ 401:
+ $ref: '#/components/responses/401'
+ 403:
+ $ref: '#/components/responses/403'
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ default:
+ $ref: '#/components/responses/default'
+ '/api/v1/clients/{id}':
+ get:
+ tags:
+ - clients
+ summary: 'Show client'
+ description: 'Displays a client by id'
+ operationId: showClient
+ parameters:
+ - $ref: '#/components/parameters/X-API-TOKEN'
+ - $ref: '#/components/parameters/X-Requested-With'
+ - $ref: '#/components/parameters/client_include'
+ - name: id
+ in: path
+ description: 'The Client Hashed ID'
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: 'Returns the client object'
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
+ X-RateLimit-Remaining:
+ $ref: '#/components/headers/X-RateLimit-Remaining'
+ X-RateLimit-Limit:
+ $ref: '#/components/headers/X-RateLimit-Limit'
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Client'
+ 401:
+ $ref: '#/components/responses/401'
+ 403:
+ $ref: '#/components/responses/403'
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ default:
+ $ref: '#/components/responses/default'
+ put:
+ tags:
+ - clients
+ summary: 'Update client'
+ description: 'Handles the updating of a client by id'
+ operationId: updateClient
+ parameters:
+ - $ref: '#/components/parameters/X-API-TOKEN'
+ - $ref: '#/components/parameters/X-Requested-With'
+ - $ref: '#/components/parameters/client_include'
+ - name: id
+ in: path
+ description: 'The Client Hashed ID'
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ requestBody:
+ description: Client object that needs to be updated
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ClientRequest'
+ responses:
+ 200:
+ description: 'Returns the client object'
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
+ X-RateLimit-Remaining:
+ $ref: '#/components/headers/X-RateLimit-Remaining'
+ X-RateLimit-Limit:
+ $ref: '#/components/headers/X-RateLimit-Limit'
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Client'
+ 401:
+ $ref: '#/components/responses/401'
+ 403:
+ $ref: '#/components/responses/403'
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ default:
+ $ref: '#/components/responses/default'
+ delete:
+ tags:
+ - clients
+ summary: 'Delete client'
+ description: 'Handles the deletion of a client by id'
+ operationId: deleteClient
+ parameters:
+ - $ref: '#/components/parameters/X-API-TOKEN'
+ - $ref: '#/components/parameters/X-Requested-With'
+ - $ref: '#/components/parameters/client_include'
+ - name: id
+ in: path
+ description: 'The Client Hashed ID'
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: 'Returns a HTTP status'
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
+ X-RateLimit-Remaining:
+ $ref: '#/components/headers/X-RateLimit-Remaining'
+ X-RateLimit-Limit:
+ $ref: '#/components/headers/X-RateLimit-Limit'
+ 401:
+ $ref: '#/components/responses/401'
+ 403:
+ $ref: '#/components/responses/403'
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ default:
+ $ref: '#/components/responses/default'
+ '/api/v1/clients/{id}/edit':
+ get:
+ tags:
+ - clients
+ summary: 'Edit Client'
+ description: 'Displays a client by id, essentially an alias of the show route'
+ operationId: editClient
+ parameters:
+ - $ref: '#/components/parameters/X-API-TOKEN'
+ - $ref: '#/components/parameters/X-Requested-With'
+ - $ref: '#/components/parameters/include'
+ - name: id
+ in: path
+ description: 'The Client Hashed ID'
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: 'Returns the client object'
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
+ X-RateLimit-Remaining:
+ $ref: '#/components/headers/X-RateLimit-Remaining'
+ X-RateLimit-Limit:
+ $ref: '#/components/headers/X-RateLimit-Limit'
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Client'
+ 401:
+ $ref: '#/components/responses/401'
+ 403:
+ $ref: '#/components/responses/403'
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ default:
+ $ref: '#/components/responses/default'
+ /api/v1/clients/create:
+ get:
+ tags:
+ - clients
+ summary: 'Blank Client'
+ description: 'Returns a blank object with default values'
+ operationId: getClientsCreate
+ parameters:
+ - $ref: '#/components/parameters/X-API-TOKEN'
+ - $ref: '#/components/parameters/X-Requested-With'
+ - $ref: '#/components/parameters/client_include'
+ responses:
+ 200:
+ description: 'A blank client object'
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
+ X-RateLimit-Remaining:
+ $ref: '#/components/headers/X-RateLimit-Remaining'
+ X-RateLimit-Limit:
+ $ref: '#/components/headers/X-RateLimit-Limit'
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Client'
+ 401:
+ $ref: '#/components/responses/401'
+ 403:
+ $ref: '#/components/responses/403'
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ default:
+ $ref: '#/components/responses/default'
+ /api/v1/clients/bulk:
+ post:
+ tags:
+ - clients
+ summary: 'Bulk client actions'
+ description: 'Archive / Restore / Delete in bulk'
+ operationId: bulkClients
+ parameters:
+ - $ref: '#/components/parameters/X-API-TOKEN'
+ - $ref: '#/components/parameters/X-Requested-With'
+ - $ref: '#/components/parameters/index'
+ requestBody:
+ description: 'Bulk action array'
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GenericBulkAction'
+
+ responses:
+ 200:
+ description: 'The Client listresponse'
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
+ X-RateLimit-Remaining:
+ $ref: '#/components/headers/X-RateLimit-Remaining'
+ X-RateLimit-Limit:
+ $ref: '#/components/headers/X-RateLimit-Limit'
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Client'
+ 401:
+ $ref: '#/components/responses/401'
+ 403:
+ $ref: '#/components/responses/403'
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ default:
+ $ref: '#/components/responses/default'
+ '/api/v1/clients/{id}/upload':
+ post:
+ tags:
+ - clients
+ summary: 'Add client document'
+ description: 'Handles the uploading of a document to a client, please note due to a quirk in REST you will need to use a _method parameter with value of POST'
+ operationId: uploadClient
+ parameters:
+ - $ref: '#/components/parameters/X-API-TOKEN'
+ - $ref: '#/components/parameters/X-Requested-With'
+ - $ref: '#/components/parameters/client_include'
+ - name: id
+ in: path
+ description: 'The Client Hashed ID'
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ requestBody:
+ required: true
+ content:
+ multipart/form-data:
+ schema:
+ type: object
+ properties:
+ _method:
+ type: string
+ example: POST
+ documents:
+ type: array
+ items:
+ format: binary
+ responses:
+ 200:
+ description: 'Returns the client object'
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
+ X-RateLimit-Remaining:
+ $ref: '#/components/headers/X-RateLimit-Remaining'
+ X-RateLimit-Limit:
+ $ref: '#/components/headers/X-RateLimit-Limit'
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Client'
+ 401:
+ $ref: '#/components/responses/401'
+ 403:
+ $ref: '#/components/responses/403'
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ default:
+ $ref: '#/components/responses/default'
+ '/api/v1/clients/{id}/purge':
+ post:
+ tags:
+ - clients
+ summary: 'Purge client'
+ description: |
+ Handles purging a clients.
+
+ Please note this is a destructive action.
+
+ This action will remove all data associated with the client and cannot be undone.
+ operationId: purgeClient
+ parameters:
+ - $ref: '#/components/parameters/X-API-TOKEN'
+ - $ref: '#/components/parameters/X-Requested-With'
+ - $ref: '#/components/parameters/X-API-PASSWORD'
+ - $ref: '#/components/parameters/client_include'
+ - name: id
+ in: path
+ description: 'The Client Hashed ID'
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: 'Returns the client object'
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
+ X-RateLimit-Remaining:
+ $ref: '#/components/headers/X-RateLimit-Remaining'
+ X-RateLimit-Limit:
+ $ref: '#/components/headers/X-RateLimit-Limit'
+ 401:
+ $ref: '#/components/responses/401'
+ 403:
+ $ref: '#/components/responses/403'
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ default:
+ $ref: '#/components/responses/default'
+ '/api/v1/clients/{id}/{mergeable_client_hashed_id}/merge':
+ post:
+ tags:
+ - clients
+ summary: 'Merge client'
+ description: |
+ Handles merging 2 clients
+
+ The id parameter is the client that will be the primary client after the merge has completed.
+
+ The mergeable_client_hashed_id is the client that will be merged into the primary client, this clients records will be updated and associated with the primary client.
+ operationId: mergeClient
+ parameters:
+ - $ref: '#/components/parameters/X-API-TOKEN'
+ - $ref: '#/components/parameters/X-Requested-With'
+ - $ref: '#/components/parameters/client_include'
+ - $ref: '#/components/parameters/X-API-PASSWORD'
+ - name: id
+ in: path
+ description: 'The Client Hashed ID'
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ - name: mergeable_client_hashed_id
+ in: path
+ description: 'The Mergeable Client Hashed ID'
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: 'Returns the client object'
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
+ X-RateLimit-Remaining:
+ $ref: '#/components/headers/X-RateLimit-Remaining'
+ X-RateLimit-Limit:
+ $ref: '#/components/headers/X-RateLimit-Limit'
+ 401:
+ $ref: '#/components/responses/401'
+ 403:
+ $ref: '#/components/responses/403'
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ default:
+ $ref: '#/components/responses/default'
+ /api/v1/client_statement:
+ post:
+ tags:
+ - clients
+ summary: 'Client statement PDF'
+ description: 'Return a PDF of the client statement'
+ operationId: clientStatement
+ parameters:
+ - $ref: '#/components/parameters/X-API-TOKEN'
+ - $ref: '#/components/parameters/X-Requested-With'
+ - $ref: '#/components/parameters/include'
+ requestBody:
+ description: 'Statement Options'
+ required: true
+ content:
+ application/json:
+ schema:
+ properties:
+ start_date:
+ description: 'The start date of the statement period - format Y-m-d'
+ type: string
+ end_date:
+ description: 'The start date of the statement period - format Y-m-d'
+ type: string
+ client_id:
+ description: 'The hashed ID of the client'
+ type: string
+ show_payments_table:
+ description: 'Flag which determines if the payments table is shown'
+ type: boolean
+ show_credits_table:
+ description: 'Flag which determines if the credits table is shown'
+ type: boolean
+ show_aging_table:
+ description: 'Flag which determines if the aging table is shown'
+ type: boolean
+ type: object
+ responses:
+ 200:
+ description: 'Returns the client object'
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
+ X-RateLimit-Remaining:
+ $ref: '#/components/headers/X-RateLimit-Remaining'
+ X-RateLimit-Limit:
+ $ref: '#/components/headers/X-RateLimit-Limit'
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Client'
+ 401:
+ $ref: '#/components/responses/401'
+ 403:
+ $ref: '#/components/responses/403'
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: '#/components/responses/default'
+ /api/v1/reactivate_email/{bounce_id}:
+ post:
+ tags:
+ - clients
+ summary: 'Removes email suppression of a user in the system'
+ description: 'Emails are suppressed by PostMark, when they receive a Hard bounce / Spam Complaint. This endpoint allows you to remove the suppression and send emails to the user again.'
+ operationId: reactivateEmail
+ parameters:
+ - $ref: '#/components/parameters/X-API-TOKEN'
+ - $ref: '#/components/parameters/X-Requested-With'
+ - $ref: '#/components/parameters/include'
+ - name: bounce_id
+ in: path
+ description: 'The postmark Bounce ID reference'
+ required: true
+ schema:
+ type: string
+ format: string
+ example: 123243
+ responses:
+ 200:
+ description: 'Success'
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
+ X-RateLimit-Remaining:
+ $ref: '#/components/headers/X-RateLimit-Remaining'
+ X-RateLimit-Limit:
+ $ref: '#/components/headers/X-RateLimit-Limit'
+ 400:
+ description: 'Postmark exception - generated if the suppression cannot be removed for any reason'
+ 401:
+ $ref: '#/components/responses/401'
+ 403:
+ $ref: '#/components/responses/403'
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: '#/components/responses/default'
+ /api/v1/clients/{client}/updateTaxData:
+ post:
+ tags:
+ - clients
+ summary: 'Update tax data'
+ description: 'Updates the clients tax data - if their address has changed'
+ operationId: updateClientTaxData
+ parameters:
+ - $ref: '#/components/parameters/X-API-TOKEN'
+ - $ref: '#/components/parameters/X-Requested-With'
+ - $ref: '#/components/parameters/include'
+ - name: client
+ in: path
+ description: 'The Client Hashed ID reference'
+ required: true
+ schema:
+ type: string
+ format: string
+ example: V2J234DFA
+ responses:
+ 200:
+ description: 'Success'
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: '#/components/headers/X-MINIMUM-CLIENT-VERSION'
+ X-RateLimit-Remaining:
+ $ref: '#/components/headers/X-RateLimit-Remaining'
+ X-RateLimit-Limit:
+ $ref: '#/components/headers/X-RateLimit-Limit'
+ 400:
+ description: 'Postmark exception - generated if the suppression cannot be removed for any reason'
+ 401:
+ $ref: '#/components/responses/401'
+ 403:
+ $ref: '#/components/responses/403'
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: '#/components/responses/default'
+ /api/v1/projects:
+ get:
+ tags:
+ - projects
+ summary: "List projects"
+ description: "Lists projects"
+ operationId: getProjects
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - $ref: "#/components/parameters/index"
+ responses:
+ 200:
+ description: "A list of projects"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ data:
+ type: array
+ items:
+ $ref: '#/components/schemas/Project'
+ meta:
+ type: object
+ $ref: '#/components/schemas/Meta'
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ post:
+ tags:
+ - projects
+ summary: "Create project"
+ description: "Adds an project to a company"
+ operationId: storeProject
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ responses:
+ 200:
+ description: "Returns the saved project object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Project"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ "/api/v1/projects/{id}":
+ get:
+ tags:
+ - projects
+ summary: "Show project"
+ description: "Displays a project by id"
+ operationId: showProject
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Project Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the expense object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Project"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ put:
+ tags:
+ - projects
+ summary: "Update project"
+ description: "Handles the updating of a project by id"
+ operationId: updateProject
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Project Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the project object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Project"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ delete:
+ tags:
+ - projects
+ summary: "Delete project"
+ description: "Handles the deletion of a project by id"
+ operationId: deleteProject
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Project Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns a HTTP status"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ "/api/v1/projects/{id}/edit":
+ get:
+ tags:
+ - projects
+ summary: "Edit project"
+ description: "Displays a project by id"
+ operationId: editProject
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Project Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the project object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Project"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ /api/v1/projects/create:
+ get:
+ tags:
+ - projects
+ summary: "Blank project"
+ description: "Returns a blank object with default values"
+ operationId: getProjectsCreate
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ responses:
+ 200:
+ description: "A blank project object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Project"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ /api/v1/projects/bulk:
+ post:
+ tags:
+ - projects
+ summary: "Bulk project actions"
+ description: ""
+ operationId: bulkProjects
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/index"
+ requestBody:
+ description: "User credentials"
+ required: true
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ description: "Array of hashed IDs to be bulk 'actioned"
+ type: integer
+ example: "[0,1,2,3]"
+ responses:
+ 200:
+ description: "The Project User response"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Project"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ "/api/v1/projects/{id}/upload":
+ post:
+ tags:
+ - projects
+ summary: "Uploads a project document"
+ description: "Handles the uploading of a document to a project"
+ operationId: uploadProject
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Project Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ requestBody:
+ description: "File Upload Body"
+ required: true
+ content:
+ multipart/form-data:
+ schema:
+ type: object
+ properties:
+ _method:
+ type: string
+ example: PUT
+ documents:
+ type: array
+ items:
+ description: "Array of binary documents for upload"
+ type: string
+ format: binary
+ responses:
+ 200:
+ description: "Returns the Project object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Project"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ /api/v1/payments:
+ get:
+ tags:
+ - payments
+ summary: "List payments"
+ description: "Lists payments, search and filters allow fine grained lists to be generated.\n\n Query parameters can be added to performed more fine grained filtering of the payments, these are handled by the PaymentFilters class which defines the methods available"
+ operationId: getPayments
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - $ref: "#/components/parameters/status"
+ - $ref: "#/components/parameters/client_id"
+ - $ref: "#/components/parameters/created_at"
+ - $ref: "#/components/parameters/updated_at"
+ - $ref: "#/components/parameters/is_deleted"
+ - $ref: "#/components/parameters/filter_deleted_clients"
+ - $ref: "#/components/parameters/vendor_id"
+ - name: filter
+ in: query
+ description: |
+ Searches across a range of columns including:
+ - amount
+ - date
+ - custom_value1
+ - custom_value2
+ - custom_value3
+ - custom_value4
+ required: false
+ schema:
+ type: string
+ example: ?filter=10
+ - name: number
+ in: query
+ description: |
+ Search payments by payment number
+ required: false
+ schema:
+ type: string
+ example: ?number=0001
+ - name: sort
+ in: query
+ description: Returns the list sorted by column in ascending or descending order.
+ required: false
+ schema:
+ type: string
+ example: id|desc number|desc balance|asc
+ responses:
+ 200:
+ description: "A list of payments"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ data:
+ type: array
+ items:
+ $ref: '#/components/schemas/Payment'
+ meta:
+ type: object
+ $ref: '#/components/schemas/Meta'
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ post:
+ tags:
+ - payments
+ summary: "Create payment"
+ description: "Adds an Payment to the system"
+ operationId: storePayment
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ requestBody:
+ description: "The payment request"
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Payment"
+ responses:
+ 200:
+ description: "Returns the saved Payment object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Payment"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+
+ "/api/v1/payments/{id}":
+ get:
+ tags:
+ - payments
+ summary: "Show payment"
+ description: "Displays an Payment by id"
+ operationId: showPayment
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Payment Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the Payment object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Payment"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ put:
+ tags:
+ - payments
+ summary: "Update payment"
+ description: "Handles the updating of an Payment by id"
+ operationId: updatePayment
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Payment Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the Payment object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Payment"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ delete:
+ tags:
+ - payments
+ summary: "Delete payment"
+ description: "Handles the deletion of an Payment by id"
+ operationId: deletePayment
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Payment Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns a HTTP status"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ "/api/v1/payments/{id}/edit":
+ get:
+ tags:
+ - payments
+ summary: "Edit payment"
+ description: "Displays an Payment by id"
+ operationId: editPayment
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Payment Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the Payment object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Payment"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ /api/v1/payments/create:
+ get:
+ tags:
+ - payments
+ summary: "Blank payment"
+ description: "Returns a blank object with default values"
+ operationId: getPaymentsCreate
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ responses:
+ 200:
+ description: "A blank Payment object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Payment"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ /api/v1/payments/refund:
+ post:
+ tags:
+ - payments
+ summary: "Refund payment"
+ description: "Adds an Refund to the system"
+ operationId: storeRefund
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ requestBody:
+ description: "The refund request"
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Payment"
+ responses:
+ 200:
+ description: "Returns the saved Payment object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Payment"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ /api/v1/payments/bulk:
+ post:
+ tags:
+ - payments
+ summary: "Bulk payment actions"
+ description: ""
+ operationId: bulkPayments
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/index"
+ requestBody:
+ description: "User credentials"
+ required: true
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ description: "Array of hashed IDs to be bulk 'actioned"
+ type: integer
+ example: "[0,1,2,3]"
+ responses:
+ 200:
+ description: "The Payment response"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Payment"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ "/api/v1/payments/{id}/{action}":
+ get:
+ deprecated: true
+ tags:
+ - payments
+ summary: "Custom payment actions"
+ description: "Performs a custom action on an Payment.\n\n The current range of actions are as follows\n - clone_to_Payment\n - clone_to_quote\n - history\n - delivery_note\n - mark_paid\n - download\n - archive\n - delete\n - email"
+ operationId: actionPayment
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Payment Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ - name: action
+ in: path
+ description: "The action string to be performed"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: clone_to_quote
+ responses:
+ 200:
+ description: "Returns the Payment object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Payment"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+
+ "/api/v1/payments/{id}/upload":
+ post:
+ tags:
+ - payments
+ summary: "Upload a payment document"
+ description: "Handles the uploading of a document to a payment"
+ operationId: uploadPayment
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The Payment Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ requestBody:
+ description: "File Upload Body"
+ required: true
+ content:
+ multipart/form-data:
+ schema:
+ type: object
+ properties:
+ _method:
+ type: string
+ example: PUT
+ documents:
+ type: array
+ items:
+ description: "Array of binary documents for upload"
+ type: string
+ format: binary
+ responses:
+ 200:
+ description: "Returns the Payment object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Payment"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ /api/v1/recurring_invoices:
+ get:
+ tags:
+ - Recurring Invoices
+ summary: "List recurring invoices"
+ description: |
+ Lists invoices with the option to chain multiple query parameters allowing fine grained filtering of the list.
+
+ operationId: getRecurringInvoices
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - $ref: "#/components/parameters/client_id"
+ - $ref: "#/components/parameters/created_at"
+ - $ref: "#/components/parameters/updated_at"
+ - $ref: "#/components/parameters/is_deleted"
+ - $ref: "#/components/parameters/filter_deleted_clients"
+ - $ref: "#/components/parameters/vendor_id"
+ - name: filter
+ in: query
+ description: |
+ Searches across a range of columns including:
+ - custom_value1
+ - custom_value2
+ - custom_value3
+ - custom_value4
+ required: false
+ schema:
+ type: string
+ example: ?filter=bob
+ - name: client_status
+ in: query
+ description: |
+ A comma separated list of invoice status strings. Valid options include:
+ - all
+ - active
+ - paused
+ - completed
+ required: false
+ schema:
+ type: string
+ example: ?client_status=active,paused
+ - name: sort
+ in: query
+ description: Returns the list sorted by column in ascending or descending order.
+ required: false
+ schema:
+ type: string
+ example: id|desc number|desc balance|asc
+ responses:
+ 200:
+ description: "A list of recurring_invoices"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ data:
+ type: array
+ items:
+ $ref: '#/components/schemas/RecurringInvoice'
+ meta:
+ type: object
+ $ref: '#/components/schemas/Meta'
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ post:
+ tags:
+ - Recurring Invoices
+ summary: "Create recurring invoice"
+ description: "Adds a Recurring Invoice to the system"
+ operationId: storeRecurringInvoice
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ responses:
+ 200:
+ description: "Returns the saved RecurringInvoice object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/RecurringInvoice"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+
+ "/api/v1/recurring_invoices/{id}":
+ get:
+ tags:
+ - Recurring Invoices
+ summary: "Show recurring invoice"
+ description: "Displays an RecurringInvoice by id"
+ operationId: showRecurringInvoice
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The RecurringInvoice Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the RecurringInvoice object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/RecurringInvoice"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ put:
+ tags:
+ - Recurring Invoices
+ summary: "Update recurring invoice"
+ description: "Handles the updating of an RecurringInvoice by id"
+ operationId: updateRecurringInvoice
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The RecurringInvoice Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the RecurringInvoice object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/RecurringInvoice"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ delete:
+ tags:
+ - Recurring Invoices
+ summary: "Delete recurring invoice"
+ description: "Handles the deletion of an RecurringInvoice by id"
+ operationId: deleteRecurringInvoice
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The RecurringInvoice Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns a HTTP status"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ "/api/v1/recurring_invoices/{id}/edit":
+ get:
+ tags:
+ - Recurring Invoices
+ summary: "Edit recurring invoice"
+ description: "Displays an RecurringInvoice by id"
+ operationId: editRecurringInvoice
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The RecurringInvoice Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the RecurringInvoice object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/RecurringInvoice"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+
+ /api/v1/recurring_invoices/create:
+ get:
+ tags:
+ - Recurring Invoices
+ summary: "Blank recurring invoice"
+ description: "Returns a blank object with default values"
+ operationId: getRecurringInvoicesCreate
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ responses:
+ 200:
+ description: "A blank RecurringInvoice object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/RecurringInvoice"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ /api/v1/recurring_invoices/bulk:
+ post:
+ tags:
+ - Recurring Invoices
+ summary: "Bulk recurring invoice actions"
+ description: |
+ There are multiple actions that are available including:
+
+ operationId: bulkRecurringInvoices
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/index"
+ requestBody:
+ description: "Bulk action details"
+ required: true
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ action:
+ type: string
+ description: |
+ The action to be performed, options include:
+ - `start`
+ Starts (or restarts) the recurring invoice. **note** if the recurring invoice has been stopped for a long time, it will attempt to catch back up firing a new Invoice every hour per interval that has been missed.
+ If you do not wish to have the recurring invoice catch up, you should set the next_send_date to the correct date you wish the recurring invoice to commence from.
+ - `stop`
+ Stops the recurring invoice.
+ - `send_now`
+ Force sends the recurring invoice - this option is only available when the recurring invoice is in a draft state.
+ - `restore`
+ Restores the recurring invoice from an archived or deleted state.
+ - `archive`
+ Archives the recurring invoice. The recurring invoice will not fire in this state.
+ - `delete`
+ Deletes a recurring invoice.
+ ids:
+ type: array
+ items:
+ description: "Array of hashed IDs to be bulk 'actioned - ['D2J234DFA','D2J234DFA','D2J234DFA']"
+ type: string
+ example:
+ action: start
+ ids: "['D2J234DFA','D2J234DFA','D2J234DFA']"
+ responses:
+ 200:
+ description: "The RecurringInvoice response"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/RecurringInvoice"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ "/api/v1/recurring_invoices/{id}/{action}":
+ get:
+ deprecated: true
+ tags:
+ - Recurring Invoices
+ summary: "Custom recurring invoice action"
+ description: "Performs a custom action on an RecurringInvoice.\n\n The current range of actions are as follows\n - clone_to_RecurringInvoice\n - clone_to_quote\n - history\n - delivery_note\n - mark_paid\n - download\n - archive\n - delete\n - email"
+ operationId: actionRecurringInvoice
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The RecurringInvoice Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ - name: action
+ in: path
+ description: "The action string to be performed"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: clone_to_quote
+ responses:
+ 200:
+ description: "Returns the RecurringInvoice object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/RecurringInvoice"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ "/api/v1/recurring_invoice/{invitation_key}/download":
+ get:
+ tags:
+ - Recurring Invoices
+ summary: "Download recurring invoice PDF"
+ description: "Downloads a specific invoice"
+ operationId: downloadRecurringInvoice
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: invitation_key
+ in: path
+ description: "The Recurring Invoice Invitation Key"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ responses:
+ 200:
+ description: "Returns the recurring invoice pdf"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ 401:
+ $ref: "#/components/responses/401"
+ 403:
+ $ref: "#/components/responses/403"
+ 422:
+ $ref: '#/components/responses/422'
+ 429:
+ $ref: '#/components/responses/429'
+ 5XX:
+ description: 'Server error'
+ default:
+ $ref: "#/components/responses/default"
+ "/api/v1/recurring_invoices/{id}/upload":
+ post:
+ tags:
+ - Recurring Invoices
+ summary: "Add recurring invoice document"
+ description: "Handles the uploading of a document to a recurring_invoice"
+ operationId: uploadRecurringInvoice
+ parameters:
+ - $ref: "#/components/parameters/X-API-TOKEN"
+ - $ref: "#/components/parameters/X-Requested-With"
+ - $ref: "#/components/parameters/include"
+ - name: id
+ in: path
+ description: "The RecurringInvoice Hashed ID"
+ required: true
+ schema:
+ type: string
+ format: string
+ example: D2J234DFA
+ requestBody:
+ description: "File Upload Body"
+ required: true
+ content:
+ multipart/form-data:
+ schema:
+ type: object
+ properties:
+ _method:
+ type: string
+ example: PUT
+ documents:
+ type: array
+ items:
+ description: "Array of binary documents for upload"
+ type: string
+ format: binary
+ responses:
+ 200:
+ description: "Returns the RecurringInvoice object"
+ headers:
+ X-MINIMUM-CLIENT-VERSION:
+ $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
+ X-RateLimit-Remaining:
+ $ref: "#/components/headers/X-RateLimit-Remaining"
+ X-RateLimit-Limit:
+ $ref: "#/components/headers/X-RateLimit-Limit"
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/RecurringInvoice"
401:
$ref: "#/components/responses/401"
403:
@@ -14257,10 +14333,10 @@ components:
schema:
type: integer
securitySchemes:
- ApiKeyAuth:
+ ApiKeyAuth:
type: apiKey
- in: header
- name: X-API-TOKEN
+ in: header
+ name: X-API-TOKEN
#examples:
# Client:
# $ref: '#/components/schemas/Client'
@@ -14336,43 +14412,43 @@ components:
# - prev: null
# - next: null
responses:
- 429:
- description: 'Rate Limit Exceeded'
+ 401:
+ description: 'Authentication error'
content:
application/json:
schema:
- $ref: '#/components/schemas/RateLimiterError'
-
- 403:
- description: 'Authorization error'
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AuthorizationError'
+ $ref: '#/components/schemas/AuthenticationError'
422:
description: 'Validation error'
content:
application/json:
schema:
$ref: '#/components/schemas/ValidationError'
+
+ 400:
+ description: 'Invalid user input'
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/InvalidInputError'
+ 403:
+ description: 'Authorization error'
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/AuthorizationError'
+ 429:
+ description: 'Rate Limit Exceeded'
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/RateLimiterError'
default:
description: 'Unexpected Error'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
- 400:
- description: 'Invalid user input'
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/InvalidInputError'
- 401:
- description: 'Authentication error'
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AuthenticationError'
parameters:
X-API-SECRET:
name: X-API-SECRET
@@ -14410,7 +14486,7 @@ components:
bank_integration_include:
name: include
in: query
- description: Include child relations of the BankIntegration object. Format is comma separated.
+ description: Include child relations of the BankIntegration object. Format is comma separated.
required: false
schema:
type: string
@@ -14475,7 +14551,7 @@ components:
summary: include=payment will include the payment object in the response
expense:
value: expense
- summary: include=expense will include the expense object in the response
+ summary: include=expense will include the expense object in the response
vendor_contact:
value: vendor_contact
summary: include=vendor_contact will include the vendor_contact object in the response
@@ -14487,7 +14563,7 @@ components:
summary: include=purchase_order will include the purchase_order object in the response
task:
value: task
- summary: include=task will include the task object in the response
+ summary: include=task will include the task object in the response
login_include:
name: include
in: query
@@ -14498,16 +14574,16 @@ components:
examples:
user:
value: user
- summary: include=user will include the user object in the response
+ summary: include=user will include the Cser object in the response
company:
value: company
- summary: include=company will include the company object in the response
+ summary: include=company will include the Company object in the response
token:
value: token
- summary: include=token will include the token object in the response
+ summary: include=token will include the Company Token object in the response
account:
value: account
- summary: include=account will include the account object in the response
+ summary: include=account will include the Account object in the response
per_page_meta:
name: per_page
in: query
@@ -14535,7 +14611,15 @@ components:
include_static:
name: include_static
in: query
- description: 'Returns static variables'
+ description: |
+ Static variables include:
+ - Currencies
+ - Countries
+ - Languages
+ - Payment Types
+ - Email Templatees
+ - Industries
+
required: false
schema:
type: string
@@ -14543,7 +14627,11 @@ components:
clear_cache:
name: clear_cache
in: query
- description: 'Clears the static cache'
+ description: |
+ Clears cache
+
+ Sometimes after a system update where the static variables have been updated, it may be necessary to clear the cache so that the static variables repopulate
+
required: false
schema:
type: string
@@ -14564,16 +14652,16 @@ components:
schema:
type: number
example: user
-
+
########################### Generic filters available across all filter ##################################
status:
name: status
in: query
description: |
- Filter the entity based on their status. ie active / archived / deleted. Format is a comma separated string with any of the following options:
+ Filter the entity based on their status. ie active / archived / deleted. Format is a comma separated string with any of the following options:
- active
- archived
- - deleted
+ - deleted
required: false
schema:
type: string
@@ -14701,151 +14789,11 @@ components:
type: string
example: '2'
type: object
+
+
- 422:
- $ref: "#/components/responses/422"
- default:
- $ref: "#/components/responses/default"
- "/api/v1/companies/{id}/edit":
- get:
- tags:
- - companies
- summary: "Shows an company for editting"
- description: "Displays an company by id"
- operationId: editCompany
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Company Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the company object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Company"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
-
- 422:
- $ref: "#/components/responses/422"
- default:
- $ref: "#/components/responses/default"
- "/api/v1/companies/{id}/upload":
- post:
- tags:
- - companies
- summary: "Uploads a document to a company"
- description: "Handles the uploading of a document to a company"
- operationId: uploadCompanies
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: id
- in: path
- description: "The Company Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- requestBody:
- description: "File Upload Body"
- required: true
- content:
- multipart/form-data:
- schema:
- type: object
- properties:
- _method:
- type: string
- example: PUT
- documents:
- type: array
- items:
- description: "Array of binary documents for upload"
- type: string
- format: binary
- responses:
- 200:
- description: "Returns the client object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Company"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
-
- 422:
- $ref: "#/components/responses/422"
- default:
- $ref: "#/components/responses/default"
- "/api/v1/companies/{company}/default":
- post:
- tags:
- - companies
- summary: "Sets the company as the default company."
- description: "Sets the company as the default company."
- operationId: setDefaultCompany
- parameters:
- - $ref: "#/components/parameters/X-API-TOKEN"
- - $ref: "#/components/parameters/X-Requested-With"
- - $ref: "#/components/parameters/include"
- - name: company
- in: path
- description: "The Company Hashed ID"
- required: true
- schema:
- type: string
- format: string
- example: D2J234DFA
- responses:
- 200:
- description: "Returns the company object"
- headers:
- X-MINIMUM-CLIENT-VERSION:
- $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
- X-RateLimit-Remaining:
- $ref: "#/components/headers/X-RateLimit-Remaining"
- X-RateLimit-Limit:
- $ref: "#/components/headers/X-RateLimit-Limit"
- content:
- application/json:
- schema:
- $ref: "#/components/schemas/Company"
- 401:
- $ref: "#/components/responses/401"
- 403:
- $ref: "#/components/responses/403"
TaskSchedulerSchema:
properties:
@@ -14930,7 +14878,7 @@ components:
type: string
example: create_client_report
type: object
-
+
TaskStatus:
properties:
id:
@@ -15001,9 +14949,9 @@ components:
type: string
example: ''
type: object
-
+
AuthenticationError:
- type: object
+ type: object
properties:
message:
description: 'These credentials do not match our records / Invalid Token'
@@ -15084,3152 +15032,211 @@ components:
type: string
example: JSON
type: object
- Product:
- type: object
+ User:
properties:
id:
+ description: 'The hashed id of the user'
type: string
- description: 'The hashed product ID.'
- example: eP01N
+ example: Opnel5aKBz
readOnly: true
- user_id:
+ first_name:
+ description: 'The first name of the user'
type: string
- description: 'The hashed ID of the user that created this product.'
- example: n30m4
- readOnly: true
- assigned_user_id:
+ example: Brad
+ last_name:
+ description: 'The last name of the user'
type: string
- description: 'The hashed ID of the user assigned to this product.'
- example: pR0j3
- project_id:
- type: string
- description: 'The hashed ID of the project that this product is associated with.'
- example: pR0j3
- vendor_id:
- type: string
- description: 'The hashed ID of the vendor that this product is associated with.'
- example: pR0j3
- custom_value1:
- type: string
- description: 'Custom value field 1.'
- example: 'Custom value 1'
- custom_value2:
- type: string
- description: 'Custom value field 2.'
- example: 'Custom value 2'
- custom_value3:
- type: string
- description: 'Custom value field 3.'
- example: 'Custom value 3'
- custom_value4:
- type: string
- description: 'Custom value field 4.'
- example: 'Custom value 4'
- product_key:
- type: string
- description: 'The product key.'
- example: '1234'
- notes:
- type: string
- description: 'Notes about the product.'
- example: 'These are some notes about the product.'
- cost:
- type: number
- format: double
- description: 'The cost of the product. (Your purchase price for this product)'
- example: 10.0
- price:
- type: number
- format: double
- description: 'The price of the product that you are charging.'
- example: 20.0
- quantity:
- type: number
- format: double
- description: 'The quantity of the product. (used as a default)'
- example: 5.0
- tax_name1:
- type: string
- description: 'The name of tax 1.'
- example: 'Tax 1'
- tax_rate1:
- type: number
- format: double
- description: 'The rate of tax 1.'
- example: 10.0
- tax_name2:
- type: string
- description: 'The name of tax 2.'
- example: 'Tax 2'
- tax_rate2:
- type: number
- format: double
- description: 'The rate of tax 2.'
- example: 5.0
- tax_name3:
- type: string
- description: 'The name of tax 3.'
- example: 'Tax 3'
- tax_rate3:
- type: number
- format: double
- description: 'The rate of tax 3.'
- example: 0.0
- archived_at:
- type: integer
- format: timestamp
- description: 'The timestamp when the product was archived.'
- example: '2022-03-18T15:00:00Z'
- readOnly: true
- created_at:
- type: integer
- format: timestamp
- description: 'The timestamp when the product was created.'
- example: '2022-03-18T15:00:00Z'
- readOnly: true
- updated_at:
- description: Timestamp
- type: integer
- format: timestamp
- example: '2022-03-18T12:34:56.789Z'
- readOnly: true
- is_deleted:
- type: boolean
- description: 'Boolean flag determining if the product has been deleted'
- example: false
- readOnly: true
- in_stock_quantity:
- type: integer
- format: int32
- description: The quantity of the product that is currently in stock
- default: 0
- stock_notification:
- type: boolean
- description: Indicates whether stock notifications are enabled for this product
- default: true
- stock_notification_threshold:
- type: integer
- format: int32
- description: The minimum quantity threshold for which stock notifications will be triggered
- default: 0
- max_quantity:
- type: integer
- format: int32
- description: The maximum quantity that can be ordered for this product
- product_image:
- type: string
- description: The URL of the product image
- format: uri-reference
- tax_id:
- type: string
- default: '1'
- description: |
- The tax category id for this product.'
-
- The following constants are available (default = '1')
-
- ```
- PRODUCT_TYPE_PHYSICAL = '1'
- PRODUCT_TYPE_SERVICE = '2'
- PRODUCT_TYPE_DIGITAL = '3'
- PRODUCT_TYPE_SHIPPING = '4'
- PRODUCT_TYPE_EXEMPT = '5'
- PRODUCT_TYPE_REDUCED_TAX = '6'
- PRODUCT_TYPE_OVERRIDE_TAX = '7'
- PRODUCT_TYPE_ZERO_RATED = '8'
- PRODUCT_TYPE_REVERSE_TAX = '9'
- ```
- example: '1'
-
- ExpenseCategory:
- properties:
- id:
- description: 'The expense hashed id'
- type: string
- example: Opnel5aKBz
- name:
- description: 'The expense category name'
- type: string
- example: Accounting
- user_id:
- description: 'The user hashed id'
- type: string
- example: XS987sD
- is_deleted:
- description: 'Flag determining whether the expense category has been deleted'
- type: boolean
- example: true
- updated_at:
- description: 'The updated at timestamp'
- type: integer
- example: '2'
- created_at:
- description: 'The created at timestamp'
- type: integer
- example: '2'
- type: object
- ProductRequest:
- type: object
- properties:
- id:
- type: string
- description: 'The hashed product ID.'
- example: eP01N
- readOnly: true
- assigned_user_id:
- type: string
- description: 'The hashed ID of the user assigned to this product.'
- example: pR0j3
-
- project_id:
- type: string
- description: 'The hashed ID of the project that this product is associated with.'
- example: pR0j3
-
- vendor_id:
- type: string
- description: 'The hashed ID of the vendor that this product is associated with.'
- example: pR0j3
-
- custom_value1:
- type: string
- description: 'Custom value field 1.'
- example: 'Custom value 1'
-
- custom_value2:
- type: string
- description: 'Custom value field 2.'
- example: 'Custom value 2'
-
- custom_value3:
- type: string
- description: 'Custom value field 3.'
- example: 'Custom value 3'
-
- custom_value4:
- type: string
- description: 'Custom value field 4.'
- example: 'Custom value 4'
-
- product_key:
- type: string
- description: 'The product key.'
- example: '1234'
-
- notes:
- type: string
- description: 'Notes about the product.'
- example: 'These are some notes about the product.'
-
- cost:
- type: number
- format: double
- description: 'The cost of the product.'
- example: 10.0
-
- price:
- type: number
- format: double
- description: 'The price of the product.'
- example: 20.0
-
- quantity:
- type: number
- format: double
- description: 'The quantity of the product.'
- example: 5.0
-
- default: 1
- tax_name1:
- type: string
- description: 'The name of tax 1.'
- example: 'Tax 1'
-
- tax_rate1:
- type: number
- format: double
- description: 'The rate of tax 1.'
- example: 10.0
-
- tax_name2:
- type: string
- description: 'The name of tax 2.'
- example: 'Tax 2'
-
- tax_rate2:
- type: number
- format: double
- description: 'The rate of tax 2.'
- example: 5.0
-
- tax_name3:
- type: string
- description: 'The name of tax 3.'
- example: 'Tax 3'
-
- tax_rate3:
- type: number
- format: double
- description: 'The rate of tax 3.'
- example: 0.0
-
- in_stock_quantity:
- type: integer
- format: int32
- description: |
- The quantity of the product that is currently in stock.
-
- **note** this field is not mutable without passing an extra query parameter which will allow modification of this value.
-
- The query parameter ?update_in_stock_quantity=true **MUST** be passed if you wish to update this value manually.
-
- default: 0
-
- stock_notification:
- type: boolean
- description: Indicates whether stock notifications are enabled for this product
- default: true
-
- stock_notification_threshold:
- type: integer
- format: int32
- description: The minimum quantity threshold for which stock notifications will be triggered
- default: 0
-
- max_quantity:
- type: integer
- format: int32
- description: The maximum quantity that can be ordered for this product
-
- product_image:
- type: string
- description: The URL of the product image
- format: uri-reference
-
- tax_id:
- type: string
- default: '1'
-
- description: |
- The tax category id for this product.'
-
- The following constants are available (default = '1')
-
- ```
- PRODUCT_TYPE_PHYSICAL = '1'
- PRODUCT_TYPE_SERVICE = '2'
- PRODUCT_TYPE_DIGITAL = '3'
- PRODUCT_TYPE_SHIPPING = '4'
- PRODUCT_TYPE_EXEMPT = '5'
- PRODUCT_TYPE_REDUCED_TAX = '6'
- PRODUCT_TYPE_OVERRIDE_TAX = '7'
- PRODUCT_TYPE_ZERO_RATED = '8'
- PRODUCT_TYPE_REVERSE_TAX = '9'
- ```
- example: '1'
-
- CompanyToken:
- properties:
- name:
- description: 'The token name'
- type: string
- example: 'Token Name'
- token:
- description: 'The token value'
- type: string
- example: AS3df3jUUH765fhfd9KJuidj3JShjA
- is_system:
- description: 'Determines whether the token is created by the system rather than a user'
- type: boolean
- example: 'true'
- type: object
- Document:
- properties:
- id:
- description: 'The document hashed id'
- type: string
- example: AS3df3A
- user_id:
- description: 'The user hashed id'
- type: string
- example: ''
- assigned_user_id:
- description: 'The assigned user hashed id'
- type: string
- example: ''
- project_id:
- description: 'The project associated with this document'
- type: string
- example: ''
- vendor_id:
- description: 'The vendor associated with this documents'
- type: string
- example: ''
- name:
- description: 'The document name'
- type: string
- example: Beauty
- url:
- description: 'The document url'
- type: string
- example: Beauty
- preview:
- description: 'The document preview url'
- type: string
- example: Beauty
- type:
- description: 'The document type'
- type: string
- example: Beauty
- disk:
- description: 'The document disk'
- type: string
- example: Beauty
- hash:
- description: 'The document hashed'
- type: string
- example: Beauty
- is_deleted:
- description: 'Flag to determine if the document is deleted'
- type: boolean
- example: true
- is_default:
- description: 'Flag to determine if the document is a default doc'
- type: boolean
- example: true
- created_at:
- description: Timestamp
- type: number
- format: integer
- example: '134341234234'
- updated_at:
- description: Timestamp
- type: number
- format: integer
- example: '134341234234'
- deleted_at:
- description: Timestamp
- type: number
- format: integer
- example: '134341234234'
- type: object
- Payment:
- properties:
- id:
- description: 'The payment hashed id'
- type: string
- example: Opnel5aKBz
- client_id:
- description: 'The client hashed id'
- type: string
- example: Opnel5aKBz
- invitation_id:
- description: 'The invitation hashed id'
- type: string
- example: Opnel5aKBz
- client_contact_id:
- description: 'The client contact hashed id'
- type: string
- example: Opnel5aKBz
- user_id:
- description: 'The user hashed id'
- type: string
- example: Opnel5aKBz
- type_id:
- description: 'The Payment Type ID'
- type: string
- example: '1'
- date:
- description: 'The Payment date'
- type: string
- example: 1-1-2014
- transaction_reference:
- description: 'The transaction reference as defined by the payment gateway'
- type: string
- example: xcsSxcs124asd
- assigned_user_id:
- description: 'The assigned user hashed id'
- type: string
- example: Opnel5aKBz
- private_notes:
- description: 'The private notes of the payment'
- type: string
- example: 'The payment was refunded due to error'
- is_manual:
- description: 'Flags whether the payment was made manually or processed via a gateway'
- type: boolean
- example: true
- is_deleted:
- description: 'Defines if the payment has been deleted'
- type: boolean
- example: true
- amount:
- description: 'The amount of this payment'
- type: number
- example: 10
- refunded:
- description: 'The refunded amount of this payment'
- type: number
- example: 10
- updated_at:
- description: Timestamp
- type: number
- format: integer
- example: '1434342123'
- archived_at:
- description: Timestamp
- type: number
- format: integer
- example: '1434342123'
- company_gateway_id:
- description: 'The company gateway id'
- type: string
- example: '3'
- paymentables:
- $ref: '#/components/schemas/Paymentable'
- invoices:
- description: ''
- type: array
- items:
- $ref: '#/components/schemas/InvoicePaymentable'
- credits:
- description: ''
- type: array
- items:
- $ref: '#/components/schemas/CreditPaymentable'
- number:
- description: 'The payment number - is a unique alpha numeric number per payment per company'
- type: string
- example: PAY_101
- type: object
-
- BankTransactionRule:
- properties:
- id:
- description: 'The bank transaction rules hashed id'
- type: string
- example: AS3df3A
- user_id:
- description: 'The user hashed id'
- type: string
- example: AS3df3A
- name:
- description: 'The name of the transaction'
- type: string
- example: 'Rule 1'
- rules:
- description: 'A mapped collection of the sub rules for the BankTransactionRule'
- type: array
- items:
- $ref: '#/components/schemas/BTRules'
- auto_convert:
- description: 'Flags whether the rule converts the transaction automatically'
- type: boolean
- example: true
- matches_on_all:
- description: 'Flags whether all subrules are required for the match'
- type: boolean
- example: true
- applies_to:
- description: 'Flags whether the rule applies to a CREDIT or DEBIT'
- type: string
- example: CREDIT
- client_id:
- description: 'The client hashed id'
- type: string
- example: AS3df3A
- vendor_id:
- description: 'The vendor hashed id'
- type: string
- example: AS3df3A
- category_id:
- description: 'The category hashed id'
- type: string
- example: AS3df3A
- type: object
- RecurringQuote:
- properties:
- id:
- description: 'The hashed id of the recurring quote'
- type: string
- example: Opnel5aKBz
- user_id:
- description: 'The user hashed id'
- type: string
- example: Opnel5aKBz
- assigned_user_id:
- description: 'The assigned user hashed id'
- type: string
- example: Opnel5aKBz
- client_id:
- description: 'The client hashed id'
- type: string
- example: Opnel5aKBz
- status_id:
- description: 'The quote status variable'
- type: string
- example: '4'
- frequency_id:
- description: 'The recurring quote frequency'
- type: number
- example: '4'
- remaining_cycles:
- description: 'The number of quotes left to be generated'
- type: number
- example: '4'
- number:
- description: 'The recurringquote number - is a unique alpha numeric number per quote per company'
- type: string
- example: INV_101
- po_number:
- description: 'The purchase order associated with this recurring quote'
- type: string
- example: PO-1234
- terms:
- description: 'The quote terms'
- type: string
- example: 'These are quote terms'
- public_notes:
- description: 'The public notes of the quote'
- type: string
- example: 'These are some public notes'
- private_notes:
- description: 'The private notes of the quote'
- type: string
- example: 'These are some private notes'
- footer:
- description: 'The quote footer notes'
- type: string
- example: ''
- custom_value1:
- description: 'A custom field value'
- type: string
- example: '2022-10-01'
- custom_value2:
- description: 'A custom field value'
- type: string
- example: 'Something custom'
- custom_value3:
- description: 'A custom field value'
- type: string
- example: ''
- custom_value4:
- description: 'A custom field value'
- type: string
- example: ''
- tax_name1:
- description: 'The tax name'
- type: string
- example: ''
- tax_name2:
- description: 'The tax name'
- type: string
- example: ''
- tax_rate1:
- description: 'The tax rate'
- type: number
- format: float
- example: '10.00'
- tax_rate2:
- description: 'The tax rate'
- type: number
- format: float
- example: '10.00'
- tax_name3:
- description: 'The tax name'
- type: string
- example: ''
- tax_rate3:
- description: 'The tax rate'
- type: number
- format: float
- example: '10.00'
- total_taxes:
- description: 'The total taxes for the quote'
- type: number
- format: float
- example: '10.00'
- line_items:
- description: 'An array of objects which define the line items of the quote'
- type: object
- example: ''
- amount:
- description: 'The quote amount'
- type: number
- format: float
- example: '10.00'
- balance:
- description: 'The quote balance'
- type: number
- format: float
- example: '10.00'
- paid_to_date:
- description: 'The amount paid on the quote to date'
- type: number
- format: float
- example: '10.00'
- discount:
- description: 'The quote discount, can be an amount or a percentage'
- type: number
- format: float
- example: '10.00'
- partial:
- description: 'The deposit/partial amount'
- type: number
- format: float
- example: '10.00'
- is_amount_discount:
- description: 'Flag determining if the discount is an amount or a percentage'
- type: boolean
- example: true
- is_deleted:
- description: 'Defines if the quote has been deleted'
- type: boolean
- example: true
- uses_inclusive_taxes:
- description: 'Defines the type of taxes used as either inclusive or exclusive'
- type: boolean
- example: true
- date:
- description: 'The quote Date'
- type: string
- format: date
- example: '1994-07-30'
- last_sent_date:
- description: 'The last date the quote was sent out'
- type: string
- format: date
- example: '1994-07-30'
- next_send_date:
- description: 'The Next date for a reminder to be sent'
- type: string
- format: date
- example: '1994-07-30'
- partial_due_date:
- description: 'The due date for the deposit/partial amount'
- type: string
- format: date
- example: '1994-07-30'
- due_date:
- description: 'The due date of the quote'
- type: string
- format: date
- example: '1994-07-30'
- settings:
- $ref: '#/components/schemas/CompanySettings'
- last_viewed:
- description: Timestamp
- type: number
- format: integer
- example: '1434342123'
- updated_at:
- description: Timestamp
- type: number
- format: integer
- example: '1434342123'
- archived_at:
- description: Timestamp
- type: number
- format: integer
- example: '1434342123'
- custom_surcharge1:
- description: 'First Custom Surcharge'
- type: number
- format: float
- example: '10.00'
- custom_surcharge2:
- description: 'Second Custom Surcharge'
- type: number
- format: float
- example: '10.00'
- custom_surcharge3:
- description: 'Third Custom Surcharge'
- type: number
- format: float
- example: '10.00'
- custom_surcharge4:
- description: 'Fourth Custom Surcharge'
- type: number
- format: float
- example: '10.00'
- custom_surcharge_tax1:
- description: 'Toggles charging taxes on custom surcharge amounts'
- type: boolean
- example: true
- custom_surcharge_tax2:
- description: 'Toggles charging taxes on custom surcharge amounts'
- type: boolean
- example: true
- custom_surcharge_tax3:
- description: 'Toggles charging taxes on custom surcharge amounts'
- type: boolean
- example: true
- custom_surcharge_tax4:
- description: 'Toggles charging taxes on custom surcharge amounts'
- type: boolean
- example: true
- type: object
- CompanyGateway:
- properties:
- id:
- description: 'The hashed id of the company gateway'
- type: string
- example: Opnel5aKBz
- gateway_key:
- description: 'The gateway key (hash)'
- type: string
- example: '2'
- accepted_credit_cards:
- description: 'Bitmask representation of cards'
- type: integer
- example: '32'
- require_billing_address:
- description: 'Determines if the the billing address is required prior to payment.'
- type: boolean
- example: true
- require_shipping_address:
- description: 'Determines if the the billing address is required prior to payment.'
- type: boolean
- example: true
- config:
- description: 'The configuration map for the gateway'
- type: string
- example: dfadsfdsafsafd
- update_details:
- description: 'Determines if the client details should be updated.'
- type: boolean
- example: true
- fees_and_limits:
- description: 'A mapped collection of the fees and limits for the configured gateway'
- type: array
- items:
- $ref: '#/components/schemas/FeesAndLimits'
- type: object
-
-
- CompanySettings:
- required:
- - currency_id
- properties:
- currency_id:
- description: 'The default currency id'
- type: string
- example: true
- timezone_id:
- description: 'The timezone id'
- type: string
- example: '15'
- date_format_id:
- description: 'The date format id'
- type: string
- example: '15'
- military_time:
- description: 'Toggles 12/24 hour time'
- type: boolean
- example: true
- language_id:
- description: 'The language id'
- type: string
- example: '1'
- show_currency_code:
- description: 'Toggles whether the currency symbol or code is shown'
- type: boolean
- example: true
- payment_terms:
- description: '-1 sets no payment term, 0 sets payment due immediately, positive integers indicates payment terms in days'
- type: integer
- example: '1'
- company_gateway_ids:
- description: 'A commad separate list of available gateways'
- type: string
- example: '1,2,3,4'
- custom_value1:
- description: 'A Custom Label'
- type: string
- example: 'Custom Label'
- custom_value2:
- description: 'A Custom Label'
- type: string
- example: 'Custom Label'
- custom_value3:
- description: 'A Custom Label'
- type: string
- example: 'Custom Label'
- custom_value4:
- description: 'A Custom Label'
- type: string
- example: 'Custom Label'
- default_task_rate:
- description: 'The default task rate'
- type: number
- format: float
- example: '10.00'
- send_reminders:
- description: 'Toggles whether reminders are sent'
- type: boolean
- example: true
- enable_client_portal_tasks:
- description: 'Show/hide the tasks panel in the client portal'
- type: boolean
- example: true
- email_style:
- description: 'options include plain,light,dark,custom'
- type: string
- example: light
- reply_to_email:
- description: 'The reply to email address'
- type: string
- example: email@gmail.com
- bcc_email:
- description: 'A comma separate list of BCC emails'
- type: string
- example: 'email@gmail.com, contact@gmail.com'
- pdf_email_attachment:
- description: 'Toggles whether to attach PDF as attachment'
- type: boolean
- example: true
- ubl_email_attachment:
- description: 'Toggles whether to attach UBL as attachment'
- type: boolean
- example: true
- email_style_custom:
- description: 'The custom template'
- type: string
- example: ''
- counter_number_applied:
- description: 'enum when the invoice number counter is set, ie when_saved, when_sent, when_paid'
- type: string
- example: when_sent
- quote_number_applied:
- description: 'enum when the quote number counter is set, ie when_saved, when_sent'
- type: string
- example: when_sent
- custom_message_dashboard:
- description: 'A custom message which is displayed on the dashboard'
- type: string
- example: 'Please pay invoices immediately'
- custom_message_unpaid_invoice:
- description: 'A custom message which is displayed in the client portal when a client is viewing a unpaid invoice.'
- type: string
- example: 'Please pay invoices immediately'
- custom_message_paid_invoice:
- description: 'A custom message which is displayed in the client portal when a client is viewing a paid invoice.'
- type: string
- example: 'Thanks for paying this invoice!'
- custom_message_unapproved_quote:
- description: 'A custom message which is displayed in the client portal when a client is viewing a unapproved quote.'
- type: string
- example: 'Please approve quote'
- lock_invoices:
- description: 'Toggles whether invoices are locked once sent and cannot be modified further'
- type: boolean
- example: true
- auto_archive_invoice:
- description: 'Toggles whether a invoice is archived immediately following payment'
- type: boolean
- example: true
- auto_archive_quote:
- description: 'Toggles whether a quote is archived after being converted to a invoice'
- type: boolean
- example: true
- auto_convert_quote:
- description: 'Toggles whether a quote is converted to a invoice when approved'
- type: boolean
- example: true
- inclusive_taxes:
- description: 'Boolean flag determining whether inclusive or exclusive taxes are used'
- type: boolean
- example: true
- translations:
- description: 'JSON payload of customized translations'
- type: object
- example: ''
- task_number_pattern:
- description: 'Allows customisation of the task number pattern'
- type: string
- example: '{$year}-{$counter}'
- task_number_counter:
- description: 'The incrementing counter for tasks'
- type: integer
- example: '1'
- reminder_send_time:
- description: 'Time from UTC +0 when the email will be sent to the client'
- type: integer
- example: '32400'
- expense_number_pattern:
- description: 'Allows customisation of the expense number pattern'
- type: string
- example: '{$year}-{$counter}'
- expense_number_counter:
- description: 'The incrementing counter for expenses'
- type: integer
- example: '1'
- vendor_number_pattern:
- description: 'Allows customisation of the vendor number pattern'
- type: string
- example: '{$year}-{$counter}'
- vendor_number_counter:
- description: 'The incrementing counter for vendors'
- type: integer
- example: '1'
- ticket_number_pattern:
- description: 'Allows customisation of the ticket number pattern'
- type: string
- example: '{$year}-{$counter}'
- ticket_number_counter:
- description: 'The incrementing counter for tickets'
- type: integer
- example: '1'
- payment_number_pattern:
- description: 'Allows customisation of the payment number pattern'
- type: string
- example: '{$year}-{$counter}'
- payment_number_counter:
- description: 'The incrementing counter for payments'
- type: integer
- example: '1'
- invoice_number_pattern:
- description: 'Allows customisation of the invoice number pattern'
- type: string
- example: '{$year}-{$counter}'
- invoice_number_counter:
- description: 'The incrementing counter for invoices'
- type: integer
- example: '1'
- quote_number_pattern:
- description: 'Allows customisation of the quote number pattern'
- type: string
- example: '{$year}-{$counter}'
- quote_number_counter:
- description: 'The incrementing counter for quotes'
- type: integer
- example: '1'
- client_number_pattern:
- description: 'Allows customisation of the client number pattern'
- type: string
- example: '{$year}-{$counter}'
- client_number_counter:
- description: 'The incrementing counter for clients'
- type: integer
- example: '1'
- credit_number_pattern:
- description: 'Allows customisation of the credit number pattern'
- type: string
- example: '{$year}-{$counter}'
- credit_number_counter:
- description: 'The incrementing counter for credits'
- type: integer
- example: '1'
- recurring_invoice_number_prefix:
- description: 'This string is prepended to the recurring invoice number'
- type: string
- example: R
- reset_counter_frequency_id:
- description: 'CONSTANT which is used to apply the frequency which the counters are reset'
- type: integer
- example: '1'
- reset_counter_date:
- description: 'The explicit date which is used to reset counters'
- type: string
- example: '2019-01-01'
- counter_padding:
- description: 'Pads the counter with leading zeros'
- type: integer
- example: '1'
- shared_invoice_quote_counter:
- description: 'Flags whether to share the counter for invoices and quotes'
- type: boolean
- example: true
- update_products:
- description: 'Determines if client fields are updated from third party APIs'
- type: boolean
- example: true
- convert_products:
- description: ''
- type: boolean
- example: true
- fill_products:
- description: 'Automatically fill products based on product_key'
- type: boolean
- example: true
- invoice_terms:
- description: 'The default invoice terms'
- type: string
- example: 'Invoice Terms are...'
- quote_terms:
- description: 'The default quote terms'
- type: string
- example: 'Quote Terms are...'
- invoice_taxes:
- description: 'Taxes can be applied to the invoice'
- type: number
- example: '1'
- invoice_design_id:
- description: 'The default design id (invoice, quote etc)'
- type: string
- example: '1'
- quote_design_id:
- description: 'The default design id (invoice, quote etc)'
- type: string
- example: '1'
- invoice_footer:
- description: 'The default invoice footer'
- type: string
- example: '1'
- invoice_labels:
- description: 'JSON string of invoice labels'
- type: string
- example: '1'
- tax_rate1:
- description: 'The tax rate (float)'
- type: number
- example: '10'
- tax_name1:
- description: 'The tax name'
- type: string
- example: GST
- tax_rate2:
- description: 'The tax rate (float)'
- type: number
- example: '10'
- tax_name2:
- description: 'The tax name'
- type: string
- example: GST
- tax_rate3:
- description: 'The tax rate (float)'
- type: number
- example: '10'
- tax_name3:
- description: 'The tax name'
- type: string
- example: GST
- payment_type_id:
- description: 'The default payment type id'
- type: string
- example: '1'
- custom_fields:
- description: 'JSON string of custom fields'
- type: string
- example: '{}'
- email_footer:
- description: 'The default email footer'
- type: string
- example: 'A default email footer'
- email_sending_method:
- description: 'The email driver to use to send email, options include default, gmail, client_postmark, client_mailgun, office365'
- type: string
- example: default
- gmail_sending_user_id:
- description: 'The hashed_id of the user account to send email from'
- type: string
- example: F76sd34D
- email_subject_invoice:
- description: ''
- type: string
- example: 'Your Invoice Subject'
- email_subject_quote:
- description: ''
- type: string
- example: 'Your Quote Subject'
- email_subject_payment:
- description: ''
- type: string
- example: 'Your Payment Subject'
- email_template_invoice:
- description: 'The full template for invoice emails'
- type: string
- example: ''
- email_template_quote:
- description: 'The full template for quote emails'
- type: string
- example: ''
- email_template_payment:
- description: 'The full template for payment emails'
- type: string
- example: ''
- email_subject_reminder1:
- description: 'Email subject for Reminder'
- type: string
- example: ''
- email_subject_reminder2:
- description: 'Email subject for Reminder'
- type: string
- example: ''
- email_subject_reminder3:
- description: 'Email subject for Reminder'
- type: string
- example: ''
- email_subject_reminder_endless:
- description: 'Email subject for endless reminders'
- type: string
- example: ''
- email_template_reminder1:
- description: 'The full template for Reminder 1'
- type: string
- example: ''
- email_template_reminder2:
- description: 'The full template for Reminder 2'
- type: string
- example: ''
- email_template_reminder3:
- description: 'The full template for Reminder 3'
- type: string
- example: ''
- email_template_reminder_endless:
- description: 'The full template for enless reminders'
- type: string
- example: ''
- enable_portal_password:
- description: 'Toggles whether a password is required to log into the client portal'
- type: boolean
- example: true
- show_accept_invoice_terms:
- description: 'Toggles whether the terms dialogue is shown to the client'
- type: boolean
- example: true
- show_accept_quote_terms:
- description: 'Toggles whether the terms dialogue is shown to the client'
- type: boolean
- example: true
- require_invoice_signature:
- description: 'Toggles whether a invoice signature is required'
- type: boolean
- example: true
- require_quote_signature:
- description: 'Toggles whether a quote signature is required'
- type: boolean
- example: true
- name:
- description: 'The company name'
- type: string
- example: 'Acme Co'
- company_logo:
- description: 'The company logo file'
- type: object
- example: logo.png
- website:
- description: 'The company website URL'
- type: string
- example: www.acme.com
- address1:
- description: 'The company address line 1'
- type: string
- example: 'Suite 888'
- address2:
- description: 'The company address line 2'
- type: string
- example: '5 Jimbo Way'
- city:
- description: 'The company city'
- type: string
- example: Sydney
- state:
- description: 'The company state'
- type: string
- example: Florisa
- postal_code:
- description: 'The company zip/postal code'
- type: string
- example: '90210'
- phone:
- description: 'The company phone'
- type: string
- example: 555-213-3948
+ example: Pitt
email:
- description: 'The company email'
+ description: 'The users email address'
type: string
- example: joe@acme.co
- country_id:
- description: 'The country ID'
+ example: brad@pitt.com
+ phone:
+ description: 'The users phone number'
type: string
- example: '1'
- vat_number:
- description: 'The company VAT/TAX ID number'
+ example: 555-1233-23232
+ signature:
+ description: 'The users sign off signature'
type: string
- example: '32 120 377 720'
- page_size:
- description: 'The default page size'
+ example: 'Have a nice day!'
+ avatar:
+ description: 'The users avatar'
type: string
- example: A4
- font_size:
- description: 'The font size'
- type: number
- example: '9'
- primary_font:
- description: 'The primary font'
+ example: 'https://url.to.your/avatar.png'
+ accepted_terms_version:
+ description: 'The version of the invoice ninja terms that has been accepted by the user'
type: string
- example: roboto
- secondary_font:
- description: 'The secondary font'
+ example: 1.0.1
+ readOnly: true
+ oauth_user_id:
+ description: 'The provider id of the oauth entity'
type: string
- example: roboto
- hide_paid_to_date:
- description: 'Flags whether to hide the paid to date field'
+ example: jkhasdf789as6f675sdf768sdfs
+ readOnly: true
+ oauth_provider_id:
+ description: 'The oauth entity id'
+ type: string
+ example: google
+ readOnly: true
+ language_id:
+ description: 'The language id of the user'
+ type: string
+ example: 1
+ verified_phone_number:
+ description: 'Boolean flag if the user has their phone verified. Required to settings up 2FA'
type: boolean
- example: false
- embed_documents:
- description: 'Toggled whether to embed documents in the PDF'
- type: boolean
- example: false
- all_pages_header:
- description: 'The header for the PDF'
- type: boolean
- example: false
- all_pages_footer:
- description: 'The footer for the PDF'
- type: boolean
- example: false
- document_email_attachment:
- description: 'Toggles whether to attach documents in the email'
- type: boolean
- example: false
- enable_client_portal_password:
- description: 'Toggles password protection of the client portal'
- type: boolean
- example: false
- enable_email_markup:
- description: 'Toggles the use of markdown in emails'
- type: boolean
- example: false
- enable_client_portal_dashboard:
- description: 'Toggles whether the client dashboard is shown in the client portal'
- type: boolean
- example: false
- enable_client_portal:
- description: 'Toggles whether the entire client portal is displayed to the client, or only the context'
- type: boolean
- example: false
- email_template_statement:
- description: 'The body of the email for statements'
+ example: true
+ readOnly: true
+ sms_verification_code:
+ description: 'The sms verification code for the user. Required to settings up 2FA'
type: string
- example: 'template matter'
- email_subject_statement:
- description: 'The subject of the email for statements'
+ example: '123456'
+ readOnly: true
+ oauth_user_token_expiry:
+ description: 'The expiry date of the oauth token'
type: string
- example: 'subject matter'
- signature_on_pdf:
- description: 'Toggles whether the signature (if available) is displayed on the PDF'
+ example: '2022-10-10'
+ readOnly: true
+ has_password:
+ description: 'Boolean flag determining if the user has a password'
type: boolean
- example: false
- quote_footer:
- description: 'The default quote footer'
- type: string
- example: 'the quote footer'
- email_subject_custom1:
- description: 'Custom reminder template subject'
- type: string
- example: 'Custom Subject 1'
- email_subject_custom2:
- description: 'Custom reminder template subject'
- type: string
- example: 'Custom Subject 2'
- email_subject_custom3:
- description: 'Custom reminder template subject'
- type: string
- example: 'Custom Subject 3'
- email_template_custom1:
- description: 'Custom reminder template body'
- type: string
- example: ''
- email_template_custom2:
- description: 'Custom reminder template body'
- type: string
- example: ''
- email_template_custom3:
- description: 'Custom reminder template body'
- type: string
- example: ''
- enable_reminder1:
- description: 'Toggles whether this reminder is enabled'
- type: boolean
- example: false
- enable_reminder2:
- description: 'Toggles whether this reminder is enabled'
- type: boolean
- example: false
- enable_reminder3:
- description: 'Toggles whether this reminder is enabled'
- type: boolean
- example: false
- num_days_reminder1:
- description: 'The Reminder interval'
- type: number
- example: '9'
- num_days_reminder2:
- description: 'The Reminder interval'
- type: number
- example: '9'
- num_days_reminder3:
- description: 'The Reminder interval'
- type: number
- example: '9'
- schedule_reminder1:
- description: '(enum: after_invoice_date, before_due_date, after_due_date)'
- type: string
- example: after_invoice_date
- schedule_reminder2:
- description: '(enum: after_invoice_date, before_due_date, after_due_date)'
- type: string
- example: after_invoice_date
- schedule_reminder3:
- description: '(enum: after_invoice_date, before_due_date, after_due_date)'
- type: string
- example: after_invoice_date
- late_fee_amount1:
- description: 'The late fee amount for reminder 1'
- type: number
- example: 10
- late_fee_amount2:
- description: 'The late fee amount for reminder 2'
- type: number
- example: 20
- late_fee_amount3:
- description: 'The late fee amount for reminder 2'
- type: number
- example: 100
- endless_reminder_frequency_id:
- description: 'The frequency id of the endless reminder'
- type: string
- example: '1'
- client_online_payment_notification:
- description: 'Determines if a client should receive the notification for a online payment'
- type: boolean
- example: false
- client_manual_payment_notification:
- description: 'Determines if a client should receive the notification for a manually entered payment'
- type: boolean
- example: false
- enable_e_invoice:
- description: 'Determines if e-invoicing is enabled'
- type: boolean
- example: false
- default_expense_payment_type_id:
- description: 'The default payment type for expenses'
- type: string
- example: '0'
- e_invoice_type:
- description: 'The e-invoice type'
- type: string
- example: 'EN16931'
- mailgun_endpoint:
- description: 'The mailgun endpoint - used to determine whether US or EU endpoints are used'
- type: string
- example: 'api.mailgun.net or api.eu.mailgun.net'
- client_initiated_payments:
- description: 'Determines if clients can initiate payments directly from the client portal'
- type: boolean
- example: false
- client_initiated_payments_minimum:
- description: 'The minimum amount a client can pay'
- type: number
- example: 10
- sync_invoice_quote_columns:
- description: 'Determines if invoice and quote columns are synced for the PDF rendering, or if they use their own columns'
- type: boolean
- example: false
- show_task_item_description:
- description: 'Determines if the task item description is shown on the invoice'
- type: boolean
- example: false
- allow_billable_task_items:
- description: 'Determines if task items can be marked as billable'
- type: boolean
- example: false
- accept_client_input_quote_approval:
- description: 'Determines if clients can approve quotes and also pass through a PO Number reference'
- type: boolean
- example: false
- custom_sending_email:
- description: 'When using Mailgun or Postmark, the FROM email address can be customized using this setting.'
+ example: true
+ readOnly: true
+ last_confirmed_email_address:
+ description: 'The last confirmed email address of the user'
type: string
example: 'bob@gmail.com'
- show_paid_stamp:
- description: 'Determines if the PAID stamp is shown on the invoice'
- type: boolean
- example: false
- show_shipping_address:
- description: 'Determines if the shipping address is shown on the invoice'
- type: boolean
- example: false
- company_logo_size:
- description: 'The size of the company logo on the PDF - percentage value between 0 and 100'
- type: number
- example: 100
- show_email_footer:
- description: 'Determines if the email footer is shown on emails'
- type: boolean
- example: false
- email_alignment:
- description: 'The alignment of the email body text, options include left / center / right'
- type: string
- example: 'left'
- auto_bill_standard_invoices:
- description: 'Determines if standard invoices are automatically billed when they are created or due'
- type: boolean
- example: false
- postmark_secret:
- description: 'The Postmark secret API key'
- type: string
- example: '123456'
- mailgun_secret:
- description: 'The Mailgun secret API key'
- type: string
- example: '123456'
- mailgun_domain:
- description: 'The Mailgun domain'
- type: string
- example: 'sandbox123456.mailgun.org'
- send_email_on_mark_paid:
- description: 'Determines if an email is sent when an invoice is marked as paid'
- type: boolean
- example: false
- vendor_portal_enable_uploads:
- description: 'Determines if vendors can upload files to the portal'
- type: boolean
- example: false
- besr_id:
- description: 'The BESR ID'
- type: string
- example: '123456'
- qr_iban:
- description: 'The IBAN for the QR code'
- type: string
- example: 'CH123456'
- email_subject_purchase_order:
- description: 'The email subject for purchase orders'
- type: string
- example: 'Purchase Order'
- email_template_purchase_order:
- description: 'The email template for purchase orders'
- type: string
- example: 'Please see attached your purchase order.'
- require_purchase_order_signature:
- description: 'Determines if a signature is required on purchase orders'
- type: boolean
- example: false
- purchase_order_public_notes:
- description: 'The public notes for purchase orders'
- type: string
- example: 'Please see attached your purchase order.'
- purchase_order_terms:
- description: 'The terms for purchase orders'
- type: string
- example: 'Please see attached your purchase order.'
- purchase_order_footer:
- description: 'The footer for purchase orders'
- type: string
- example: 'Please see attached your purchase order.'
- purchase_order_design_id:
- description: 'The design id for purchase orders'
- type: string
- example: 'hd677df'
- purchase_order_number_pattern:
- description: 'The pattern for purchase order numbers'
- type: string
- example: 'PO-000000'
- purchase_order_number_counter:
- description: 'The counter for purchase order numbers'
- type: number
- example: 1
- page_numbering_alignment:
- description: 'The alignment for page numbering: options include left / center / right'
- type: string
- example: 'left'
- page_numbering:
- description: 'Determines if page numbering is enabled on Document PDFs'
- type: boolean
- example: false
- auto_archive_invoice_cancelled:
- description: 'Determines if invoices are automatically archived when they are cancelled'
- type: boolean
- example: false
- email_from_name:
- description: 'The FROM name for emails when using Custom emailers'
- type: string
- example: 'Bob Smith'
- show_all_tasks_client_portal:
- description: 'Determines if all tasks are shown on the client portal'
- type: boolean
- example: false
- entity_send_time:
- description: 'The time that emails are sent. The time is localized to the clients locale, integer values from 1 - 24'
- type: integer
- example: 9
- shared_invoice_credit_counter:
- description: 'Determines if the invoice and credit counter are shared'
- type: boolean
- example: false
- reply_to_name:
- description: 'The reply to name for emails'
- type: string
- example: 'Bob Smith'
- hide_empty_columns_on_pdf:
- description: 'Determines if empty columns are hidden on PDFs'
- type: boolean
- example: false
- enable_reminder_endless:
- description: 'Determines if endless reminders are enabled'
- type: boolean
- example: false
- use_credits_payment:
- description: 'Determines if credits can be used as a payment method'
- type: boolean
- example: false
- recurring_invoice_number_pattern:
- description: 'The pattern for recurring invoice numbers'
- type: string
- example: 'R-000000'
- recurring_invoice_number_counter:
- description: 'The counter for recurring invoice numbers'
- type: number
- example: 1
- client_portal_under_payment_minimum:
- description: 'The minimum payment payment'
- type: number
- example: 10
- auto_bill_date:
- description: 'Determines when the invoices are auto billed, options are on_send_date (when the invoice is sent) or on_due_date (when the invoice is due))'
- type: string
- example: 'on_send_date'
- primary_color:
- description: 'The primary color for the client portal / document highlights'
- type: string
- example: '#ffffff'
- secondary_color:
- description: 'The secondary color for the client portal / document highlights'
- type: string
- example: '#ffffff'
- client_portal_allow_under_payment:
- description: 'Determines if clients can pay invoices under the invoice amount due'
- type: boolean
- example: false
- client_portal_allow_over_payment:
- description: 'Determines if clients can pay invoices over the invoice amount'
- type: boolean
- example: false
- auto_bill:
- description: 'Determines how autobilling is applied for recurring invoices. off (no auto billed), always (always auto bill), optin (The user must opt in to auto billing), optout (The user must opt out of auto billing'
- type: string
- example: 'off'
- client_portal_terms:
- description: 'The terms which are displayed on the client portal'
- type: string
- example: 'Please see attached your invoice.'
- client_portal_privacy_policy:
- description: 'The privacy policy which is displayed on the client portal'
- type: string
- example: 'These are the terms of use for using the client portal.'
- client_can_register:
- description: 'Determines if clients can register on the client portal'
- type: boolean
- example: false
- portal_design_id:
- description: 'The design id for the client portal'
- type: string
- example: 'hd677df'
- late_fee_endless_percent:
- description: 'The late fee percentage for endless late fees'
- type: number
- example: 10
- late_fee_endless_amount:
- description: 'The late fee amount for endless late fees'
- type: number
- example: 10
- auto_email_invoice:
- description: 'Determines if invoices are automatically emailed when they are created'
- type: boolean
- example: false
- email_signature:
- description: 'The email signature for emails'
- type: string
- example: 'Bob Smith'
- classification:
- description: 'The classification for the company'
- type: string
- example: 'individual'
- type: object
- SystemLog:
- properties:
- id:
- description: 'The account hashed id'
- type: string
- example: AS3df3A
- user_id:
- description: 'The user_id hashed id'
- type: string
- example: AS3df3A
- client_id:
- description: 'The client_id hashed id'
- type: string
- example: AS3df3A
- event_id:
- description: 'The Log Type ID'
- type: integer
- example: 1
- category_id:
- description: 'The Category Type ID'
- type: integer
- example: 1
- type_id:
- description: 'The Type Type ID'
- type: integer
- example: 1
- log:
- description: 'The json object of the error'
- type: object
- example: '{''key'':''value''}'
- updated_at:
- description: Timestamp
- type: string
- example: '2'
- created_at:
- description: Timestamp
- type: string
- example: '2'
- type: object
- ClientGatewayToken:
- properties:
- id:
- description: 'The hashed id of the client gateway token'
- type: string
- example: Opnel5aKBz
- client_id:
- description: 'The hashed_id of the client'
- type: string
- example: '2'
- token:
- description: 'The payment token'
- type: string
- example: '2'
- routing_number:
- description: 'THe bank account routing number'
- type: string
- example: '2'
- company_gateway_id:
- description: 'The hashed id of the company gateway'
- type: string
- example: '2'
- is_default:
- description: 'Flag determining if the token is the default payment method'
- type: boolean
- example: 'true'
- type: object
-
- GenericBulkAction:
- properties:
- action:
- type: string
- example: archive
- description: 'The action to perform ie. archive / restore / delete'
- ids:
- type: array
- items:
- format: string
- type: string
- example: 2J234DFA,D2J234DFA,D2J234DFA
- description: string array of client hashed ids
- type: object
- InvoiceInvitationRequest:
- required:
- - client_contact_id
- properties:
- id:
- description: 'The entity invitation hashed id'
- type: string
- example: Opnel5aKBz
readOnly: true
- client_contact_id:
- description: 'The client contact hashed id'
- type: string
- example: Opnel5aKBz
- key:
- description: 'The invitation key'
- type: string
- example: Opnel5aKBz4343343566236gvbb
- readOnly: true
- link:
- description: 'The invitation link'
- type: string
- example: 'https://www.example.com/invitations/Opnel5aKBz4343343566236gvbb'
- readOnly: true
- sent_date:
- description: 'The invitation sent date'
- type: string
- format: date-time
- readOnly: true
- viewed_date:
- description: 'The invitation viewed date'
- type: string
- format: date-time
- readOnly: true
- opened_date:
- description: 'The invitation opened date'
- type: string
- format: date-time
- readOnly: true
- updated_at:
- description: 'Timestamp'
- type: number
- format: integer
- example: '1434342123'
- readOnly: true
- archived_at:
- description: 'Timestamp'
- type: number
- format: integer
- example: '1434342123'
- readOnly: true
- email_error:
- description: 'The email error'
- type: string
- example: 'The email error'
- readOnly: true
- email_status:
- description: 'The email status'
- type: string
- readOnly: true
-
- Client:
- properties:
- id:
- description: 'The unique identifier of the client'
- type: string
- example: Opnel5aKBz
- readOnly: true
- contacts:
- type: array
- items:
- $ref: '#/components/schemas/ClientContact'
- user_id:
- description: 'The unique identifier of the user who created the client'
- type: string
- example: Ua6Rw4pVbS
- readOnly: true
- assigned_user_id:
- description: 'The unique identifier of the user who has been assigned the client'
- type: string
- example: Ua6Rw4pVbS
- name:
- description: 'The name of the client company or organization'
- type: string
- example: "Jim's Housekeeping"
- website:
- description: 'The website URL of the client company or organization'
- type: string
- example: 'https://www.jims-housekeeping.com'
- private_notes:
- description: 'Notes that are only visible to the user who created the client'
- type: string
- example: 'Client prefers email communication over phone calls'
- client_hash:
- description: 'A unique hash value for the client'
- type: string
- example: asdfkjhk342hjhbfdvmnfb1
- readOnly: true
- industry_id:
- description: 'The unique identifier of the industry the client operates in'
- type: number
- example: '5'
- size_id:
- description: 'The unique identifier for the size category of the client company or organization'
- type: number
- example: '2'
- address1:
- description: "First line of the client's address"
- type: string
- example: '123 Main St'
- address2:
- description: "Second line of the client's address, if needed"
- type: string
- example: 'Apt 4B'
- city:
- description: 'The city the client is located in'
- type: string
- example: 'Beverly Hills'
- state:
- description: 'The state, province, or locality the client is located in'
- type: string
- example: 'California'
- postal_code:
- description: 'The postal code or ZIP code of the client'
- type: string
- example: '90210'
- phone:
- description: "The client's phone number"
- type: string
- example: '555-3434-3434'
- country_id:
- description: "The unique identifier of the client's country"
- type: number
- format: integer
- example: '1'
- custom_value1:
- description: 'A custom field for storing additional information'
- type: string
- example: 'Preferred contact: Email'
- custom_value2:
- description: 'A custom field for storing additional information'
- type: string
- example: 'Account manager: John Doe'
- custom_value3:
- description: 'A custom field for storing additional information'
- type: string
- example: 'VIP client: Yes'
- custom_value4:
- description: 'A custom field for storing additional information'
- type: string
- example: 'Annual contract value: $50,000'
- vat_number:
- description: "The client's VAT (Value Added Tax) number, if applicable"
- type: string
- example: 'VAT123456'
- id_number:
- description: 'A unique identification number for the client, such as a tax ID or business registration number'
- type: string
- number:
- description: 'A system-assigned unique number for the client, typically used for invoicing purposes'
- type: string
- example: 'CL-0001'
- shipping_address1:
- description: "First line of the client's shipping address"
- type: string
- example: '5 Wallaby Way'
- shipping_address2:
- description: "Second line of the client's shipping address, if needed"
- type: string
- example: 'Suite 5'
- shipping_city:
- description: "The city of the client's shipping address"
- type: string
- example: 'Perth'
- shipping_state:
- description: "The state, province, or locality of the client's shipping address"
- type: string
- example: 'Western Australia'
- shipping_postal_code:
- description: "The postal code or ZIP code of the client's shipping address"
- type: string
- example: '6110'
- shipping_country_id:
- description: "The unique identifier of the country for the client's shipping address"
- type: number
- format: integer
- example: '4'
- is_deleted:
- description: 'A boolean value indicating whether the client has been deleted or not'
- type: boolean
- example: false
- readOnly: true
- balance:
- description: 'The outstanding balance the client owes'
- type: number
- format: float
- example: '500.00'
- readOnly: true
- paid_to_date:
- description: 'The total amount the client has paid to date'
- type: number
- format: float
- example: '2000.00'
- readOnly: true
- credit_balance:
- description: 'The available credit balance for the client to use on future purchases'
- type: number
- format: float
- example: '100.00'
- readOnly: true
- last_login:
- description: "The timestamp of the client's last login"
- type: number
- format: integer
- example: '1628686031'
- readOnly: true
- created_at:
- description: 'The timestamp when the client was created'
- type: number
- format: integer
- example: '1617629031'
- readOnly: true
- updated_at:
- description: 'The timestamp when the client was last updated'
- type: number
- format: integer
- example: '1628445631'
- readOnly: true
- group_settings_id:
- description: 'The group settings assigned to the client'
- type: string
- example: Opnel5aKBz
- routing_id:
- description: 'The routing address id for e-invoicing for this client'
- type: string
- example: Opnel5aKBz3489-dfkiu-2239-sdsd
- is_tax_exempt:
- description: 'Flag which defines if the client is exempt from taxes'
- type: boolean
- example: false
- has_valid_vat_number:
- description: 'Flag which defines if the client has a valid VAT number'
- type: boolean
- example: false
- readOnly: true
- payment_balance:
- description: 'Defines the payment balance the client has on file (pre payments / over payments / unapplied amounts)'
- type: number
- example: 100
- readOnly: true
- settings:
- $ref: '#/components/schemas/ClientSettings'
- type: object
- CompanyUser:
- properties:
- permissions:
- description: 'The user permissionsfor this company in a comma separated list'
- type: string
- example: 'create_invoice,create_client,view_client'
- settings:
- description: 'Settings that are used for the flutter applications to store user preferences / metadata'
- type: object
- readOnly: true
- react_settings:
- description: 'Dedicated settings object for the react web application'
- type: object
- readOnly: true
- is_owner:
- description: 'Determines whether the user owns this company'
- type: boolean
- example: true
- readOnly: true
- is_admin:
- description: 'Determines whether the user is the admin of this company'
- type: boolean
- example: true
- readOnly: true
- is_locked:
- description: 'Determines whether the users access to this company has been locked'
- type: boolean
- example: true
- readOnly: true
- updated_at:
- description: 'The last time the record was modified, format Unix Timestamp'
- type: integer
- example: '1231232312321'
- deleted_at:
- description: 'Timestamp when the user was archived, format Unix Timestamp'
- type: integer
- example: '12312312321'
- account:
- $ref: '#/components/schemas/Account'
- company:
- $ref: '#/components/schemas/Company'
- user:
- $ref: '#/components/schemas/User'
- token:
- $ref: '#/components/schemas/CompanyToken'
- type: object
- Design:
- properties:
- id:
- description: 'The design hashed id'
- type: string
- example: AS3df3A
- name:
- description: 'The design name'
- type: string
- example: Beauty
- design:
- description: 'The design HTML'
- type: string
- example: ''
- is_custom:
- description: 'Flag to determine if the design is a custom user design'
- type: boolean
- example: true
- is_active:
- description: 'Flag to determine if the design is available for use'
- type: boolean
- example: true
- is_deleted:
- description: 'Flag to determine if the design is deleted'
- type: boolean
- example: true
- created_at:
- description: Timestamp
- type: number
- format: integer
- example: '134341234234'
- updated_at:
- description: Timestamp
- type: number
- format: integer
- example: '134341234234'
- deleted_at:
- description: Timestamp
- type: number
- format: integer
- example: '134341234234'
- type: object
- InvoiceRequest:
- required:
- - client_id
- properties:
- id:
- description: 'The invoice hashed id'
- type: string
- example: Opnel5aKBz
- readOnly: true
- user_id:
- description: 'The user hashed id'
- type: string
- example: Opnel5aKBz
- assigned_user_id:
- description: 'The assigned user hashed id'
- type: string
- example: Opnel5aKBz
- client_id:
- description: 'The client hashed id'
- type: string
- example: Opnel5aKBz
- status_id:
- description: 'The invoice status variable'
- type: string
- example: '4'
- readOnly: true
- number:
- description: 'The invoice number - is a unique alpha numeric number per invoice per company'
- type: string
- example: INV_101
- po_number:
- description: 'The purchase order associated with this invoice'
- type: string
- example: PO-1234
- terms:
- description: 'The invoice terms'
- type: string
- example: 'These are invoice terms'
- public_notes:
- description: 'The public notes of the invoice'
- type: string
- example: 'These are some public notes'
- private_notes:
- description: 'The private notes of the invoice'
- type: string
- example: 'These are some private notes'
- footer:
- description: 'The invoice footer notes'
- type: string
- example: ''
- custom_value1:
- description: 'A custom field value'
- type: string
- example: '2022-10-01'
- custom_value2:
- description: 'A custom field value'
- type: string
- example: 'Something custom'
- custom_value3:
- description: 'A custom field value'
- type: string
- example: ''
- custom_value4:
- description: 'A custom field value'
- type: string
- example: ''
- tax_name1:
- description: 'The tax name'
- type: string
- example: ''
- tax_name2:
- description: 'The tax name'
- type: string
- example: ''
- tax_rate1:
- description: 'The tax rate'
- type: number
- format: float
- example: '10.00'
- tax_rate2:
- description: 'The tax rate'
- type: number
- format: float
- example: '10.00'
- tax_name3:
- description: 'The tax name'
- type: string
- example: ''
- tax_rate3:
- description: 'The tax rate'
- type: number
- format: float
- example: '10.00'
- total_taxes:
- description: 'The total taxes for the invoice'
- type: number
- format: float
- example: '10.00'
- readOnly: true
- line_items:
- type: array
- description: 'An array of objects which define the line items of the invoice'
- items:
- $ref: '#/components/schemas/InvoiceItem'
- invitations:
- type: array
- description: 'An array of objects which define the invitations of the invoice'
- items:
- $ref: '#/components/schemas/InvoiceInvitationRequest'
- amount:
- description: 'The invoice amount'
- type: number
- format: float
- example: '10.00'
- readOnly: true
- balance:
- description: 'The invoice balance'
- type: number
- format: float
- example: '10.00'
- readOnly: true
- paid_to_date:
- description: 'The amount paid on the invoice to date'
- type: number
- format: float
- example: '10.00'
- readOnly: true
- discount:
- description: 'The invoice discount, can be an amount or a percentage'
- type: number
- format: float
- example: '10.00'
- partial:
- description: 'The deposit/partial amount'
- type: number
- format: float
- example: '10.00'
- is_amount_discount:
- description: 'Flag determining if the discount is an amount or a percentage'
- type: boolean
- example: true
- is_deleted:
- description: 'Defines if the invoice has been deleted'
- type: boolean
- example: true
- readOnly: true
- uses_inclusive_taxes:
- description: 'Defines the type of taxes used as either inclusive or exclusive'
- type: boolean
- example: true
- date:
- description: 'The Invoice Date'
- type: string
- format: date
- example: '1994-07-30'
- last_sent_date:
- description: 'The last date the invoice was sent out'
- type: string
- format: date
- example: '1994-07-30'
- readOnly: true
- next_send_date:
- description: 'The Next date for a reminder to be sent'
- type: string
- format: date
- example: '1994-07-30'
- readOnly: true
- partial_due_date:
- description: 'The due date for the deposit/partial amount'
- type: string
- format: date
- example: '1994-07-30'
- due_date:
- description: 'The due date of the invoice'
- type: string
- format: date
- example: '1994-07-30'
- last_viewed:
- description: Timestamp
- type: number
- format: integer
- example: '1434342123'
- readOnly: true
- updated_at:
- description: Timestamp
- type: number
- format: integer
- example: '1434342123'
- readOnly: true
- archived_at:
- description: Timestamp
- type: number
- format: integer
- example: '1434342123'
- readOnly: true
- custom_surcharge1:
- description: 'First Custom Surcharge'
- type: number
- format: float
- example: '10.00'
- custom_surcharge2:
- description: 'Second Custom Surcharge'
- type: number
- format: float
- example: '10.00'
- custom_surcharge3:
- description: 'Third Custom Surcharge'
- type: number
- format: float
- example: '10.00'
- custom_surcharge4:
- description: 'Fourth Custom Surcharge'
- type: number
- format: float
- example: '10.00'
- custom_surcharge_tax1:
- description: 'Toggles charging taxes on custom surcharge amounts'
- type: boolean
- example: true
- custom_surcharge_tax2:
- description: 'Toggles charging taxes on custom surcharge amounts'
- type: boolean
- example: true
- custom_surcharge_tax3:
- description: 'Toggles charging taxes on custom surcharge amounts'
- type: boolean
- example: true
- custom_surcharge_tax4:
- description: 'Toggles charging taxes on custom surcharge amounts'
- type: boolean
- example: true
- project_id:
- description: 'The project associated with this invoice'
- type: string
- example: Opnel5aKBz
- type: object
- FillableInvoice:
- properties:
- assigned_user_id:
- description: "The assigned user's hashed ID"
- type: string
- example: 'a1b2c3d4'
- client_id:
- description: "The client's hashed ID"
- type: string
- example: 'x1y2z3a4'
- number:
- description: "The unique alphanumeric invoice number for each invoice per company"
- type: string
- example: INV_101
- po_number:
- description: "The purchase order number associated with the invoice"
- type: string
- example: 'PO12345'
- terms:
- description: "The terms and conditions for the invoice"
- type: string
- example: 'Net 30'
- public_notes:
- description: "Public notes visible to the client on the invoice"
- type: string
- example: 'Thank you for your business.'
- private_notes:
- description: "Private notes for internal use only"
- type: string
- example: 'Client is a slow payer.'
- footer:
- description: "The footer text displayed on the invoice"
- type: string
- example: 'Authorized Signature'
- custom_value1:
- description: "First custom value for additional information"
- type: string
- example: 'Project ABC'
- custom_value2:
- description: "Second custom value for additional information"
- type: string
- example: 'Department XYZ'
- custom_value3:
- description: "Third custom value for additional information"
- type: string
- example: 'Location 123'
- custom_value4:
- description: "Fourth custom value for additional information"
- type: string
- example: 'Currency USD'
- tax_name1:
- description: "Name of the first tax applied to the invoice"
- type: string
- example: 'VAT'
- tax_name2:
- description: "Name of the second tax applied to the invoice"
- type: string
- example: 'GST'
- tax_rate1:
- description: "Rate of the first tax applied to the invoice"
- type: number
- example: 10.00
- tax_rate2:
- description: "Rate of the second tax applied to the invoice"
- type: number
- example: 5.00
- tax_name3:
- description: "Name of the third tax applied to the invoice"
- type: string
- example: 'PST'
- tax_rate3:
- description: "Rate of the third tax applied to the invoice"
- type: number
- example: 8.00
- line_items:
- type: array
- description: 'An array of objects which define the line items of the invoice'
- items:
- $ref: '#/components/schemas/InvoiceItem'
- discount:
- description: "The discount applied to the invoice"
- type: number
- example: 10.00
- partial:
- description: "The partial amount applied to the invoice"
- type: number
- example: 20.00
- is_amount_discount:
- description: "Indicates whether the discount applied is a fixed amount or a percentage"
- type: boolean
- example: true
- uses_inclusive_taxes:
- description: "Indicates whether the tax rates applied to the invoice are inclusive or exclusive"
- type: boolean
- example: true
- date:
- description: "The date the invoice was issued"
- type: string
- example: '1994-07-30'
- partial_due_date:
- description: "The due date for the partial payment"
- type: string
- example: '1994-08-15'
- due_date:
- description: "The due date for the invoice"
- type: string
- example: '1994-08-30'
- custom_surcharge1:
- description: "First custom surcharge applied to the invoice"
- type: number
- example: 10.00
- custom_surcharge2:
- description: "Second custom surcharge applied to the invoice"
- type: number
- example: 15.00
- custom_surcharge3:
- description: "Third custom surcharge applied to the invoice"
- type: number
- example: 5.00
- custom_surcharge4:
- description: "Fourth custom surcharge applied to the invoice"
- type: number
- example: 20.00
- type: object
- Paymentable:
- properties:
- id:
- description: 'The paymentable hashed id'
- type: string
- example: AS3df3A
- invoice_id:
- description: 'The invoice hashed id'
- type: string
- example: AS3df3A
- credit_id:
- description: 'The credit hashed id'
- type: string
- example: AS3df3A
- refunded:
- description: 'The amount that has been refunded for this payment'
- type: number
- format: float
- example: '10.00'
- amount:
- description: 'The amount that has been applied to the payment'
- type: number
- format: float
- example: '10.00'
- updated_at:
- description: Timestamp
- type: number
- format: integer
- example: '1434342123'
- created_at:
- description: Timestamp
- type: number
- format: integer
- example: '1434342123'
- type: object
- BankTransaction:
- properties:
- id:
- description: 'The bank integration hashed id'
- type: string
- example: AS3df3A
- user_id:
- description: 'The user hashed id'
- type: string
- example: AS3df3A
- transaction_id:
- description: 'The id of the transaction rule'
- type: integer
- example: 343434
- amount:
- description: 'The transaction amount'
- type: number
- example: 10
- currency_id:
- description: 'The currency ID of the currency'
- type: string
- example: '1'
- account_type:
- description: 'The account type'
- type: string
- example: creditCard
- description:
- description: 'The description of the transaction'
- type: string
- example: 'Potato purchases for kevin'
- category_id:
- description: 'The category id'
- type: integer
- example: 1
- category_type:
- description: 'The category description'
- type: string
- example: Expenses
- base_type:
- description: 'Either CREDIT or DEBIT'
- type: string
- example: CREDIT
- date:
- description: 'The date of the transaction'
- type: string
- example: '2022-09-01'
- bank_account_id:
- description: 'The ID number of the bank account'
- type: integer
- example: '1'
- type: object
- Meta:
- properties:
- pagination:
- $ref: '#/components/schemas/Pagination'
- Pagination:
- type: object
- properties:
- total:
- type: integer
- description: 'The total number of items'
- example: 1
- readOnly: true
- count:
- type: integer
- description: 'The number of items per page'
- example: 1
- readOnly: true
- per_page:
- type: integer
- description: 'The number of items per page'
- example: 1
- readOnly: true
- current_page:
- type: integer
- description: 'The current page number'
- example: 1
- readOnly: true
- total_pages:
- type: integer
- description: 'The total number of pages'
- example: 1
- readOnly: true
- links:
- type: object
- description: 'The pagination links'
- readOnly: true
-
- FeesAndLimits:
- properties:
- min_limit:
- description: 'The minimum amount accepted for this gateway'
- type: string
- example: '2'
- max_limit:
- description: 'The maximum amount accepted for this gateway'
- type: string
- example: '2'
- fee_amount:
- description: 'The gateway fee amount'
- type: number
- format: float
- example: '2.0'
- fee_percent:
- description: 'The gateway fee percentage'
- type: number
- format: float
- example: '2.0'
- fee_tax_name1:
- description: 'Fee tax name'
- type: string
- example: GST
- fee_tax_name2:
- description: 'Fee tax name'
- type: string
- example: VAT
- fee_tax_name3:
- description: 'Fee tax name'
- type: string
- example: 'CA Sales Tax'
- fee_tax_rate1:
- description: 'The tax rate'
- type: number
- format: float
- example: '10.0'
- fee_tax_rate2:
- description: 'The tax rate'
- type: number
- format: float
- example: '17.5'
- fee_tax_rate3:
- description: 'The tax rate'
- type: number
- format: float
- example: '25.0'
- fee_cap:
- description: 'If set the fee amount will be no higher than this amount'
- type: number
- format: float
- example: '2.0'
- adjust_fee_percent:
- description: 'Adjusts the fee to match the exact gateway fee.'
- type: boolean
- example: true
- type: object
- InvoiceItem:
- type: object
- properties:
- quantity:
- type: number
- example: 1
- description: 'The quantity of the product offered for this line item'
- cost:
- type: number
- format: float
- example: 10.00
- description: 'The cost of the product offered for this line item'
- product_key:
- type: string
- example: 'Product key'
- description: 'The product key of the product offered for this line item (Referred to as Product in the product tab)'
- product_cost:
- type: number
- format: float
- example: 10.00
- description: 'The cost of the product offered for this line item (Referred to as Cost in the product tab)'
- notes:
- type: string
- example: 'Item notes'
- description: 'The notes/description for the product offered for this line item'
- discount:
- type: number
- format: float
- example: 5.00
- description: 'The discount applied to the product offered for this line item'
- is_amount_discount:
- type: boolean
- example: false
- description: 'Indicates whether the discount applied to the product offered for this line item is a fixed amount or a percentage'
- tax_name1:
- type: string
- example: 'GST'
- description: 'The name of the first tax applied to the product offered for this line item'
- tax_rate1:
- type: number
- format: float
- example: 10.00
- description: 'The rate of the first tax applied to the product offered for this line item'
- tax_name2:
- type: string
- example: 'VAT'
- description: 'The name of the second tax applied to the product offered for this line item'
- tax_rate2:
- type: number
- format: float
- example: 5.00
- description: 'The rate of the second tax applied to the product offered for this line item'
- tax_name3:
- type: string
- example: 'CA Sales Tax'
- description: 'The name of the third tax applied to the product offered for this line item'
- tax_rate3:
- type: number
- format: float
- example: 3.00
- description: 'The rate of the third tax applied to the product offered for this line item'
- sort_id:
- type: string
- example: '0'
- description: 'Deprecated'
- deprecated: true
- line_total:
- type: number
- format: float
- example: 10.00
- description: 'The total amount of the product offered for this line item'
- readOnly: true
- gross_line_total:
- type: number
- format: float
- example: 15.00
- description: 'The total amount of the product offered for this line item before discounts'
- readOnly: true
- tax_amount:
- type: number
- format: float
- example: 1.00
- description: 'The total amount of tax applied to the product offered for this line item'
- readOnly: true
- date:
- type: string
- format: date-time
- example: '2023-03-19T00:00:00Z'
- description: 'Deprecated'
- deprecated: true
custom_value1:
+ description: 'A custom value'
type: string
example: 'Custom value 1'
- description: 'The first custom value of the product offered for this line item'
custom_value2:
+ description: 'A custom value'
type: string
- example: 'Custom value 2'
- description: 'The second custom value of the product offered for this line item'
+ example: '$1000'
custom_value3:
+ description: 'A custom value'
type: string
example: 'Custom value 3'
- description: 'The third custom value of the product offered for this line item'
custom_value4:
+ description: 'A custom value'
type: string
example: 'Custom value 4'
- description: 'The fourth custom value of the product offered for this line item'
- type_id:
- type: string
- example: '1'
- description: '1 = product, 2 = service, 3 unpaid gateway fee, 4 paid gateway fee, 5 late fee, 6 expense'
- default: '1'
- tax_id:
- type: string
- example: '1'
- default: '1'
- description: 'The tax ID of the product: 1 product, 2 service, 3 digital, 4 shipping, 5 exempt, 5 reduced tax, 7 override, 8 zero rate, 9 reverse tax'
- Project:
- type: object
- properties:
- id:
- description: 'The project hashed id'
- type: string
- example: Opnel5aKBz
- user_id:
- description: 'The user hashed id'
- type: string
- example: Opnel5aKBz
- assigned_user_id:
- description: The assigned user identifier associated with the project
- type: string
- example: Opnel5aKBz
- client_id:
- type: string
- example: Opnel5aKBz
- description: The client identifier associated with the project
- name:
- type: string
- description: The name of the project
- example: 'New Project'
- task_rate:
- type: number
- format: float
- example: 10
- description: The default rate per task for the project
- due_date:
- type: string
- format: date
- example: '2019-01-01'
- description: The due date for the project
- private_notes:
- type: string
- description: Private notes associated with the project
- budgeted_hours:
- type: number
- format: float
- description: The number of budgeted hours for the project
- custom_value1:
- type: string
- description: Custom value field 1
- custom_value2:
- type: string
- description: Custom value field 2
- custom_value3:
- type: string
- description: Custom value field 3
- custom_value4:
- type: string
- description: Custom value field 4
- created_at:
- type: number
- format: integer
- example: 134341234234
- description: The timestamp of the project creation
- updated_at:
- type: number
- format: integer
- example: 134341234234
- description: The timestamp of the last project update
- archived_at:
- type: number
- format: integer
- example: 134341234234
- description: The timestamp of the project deletion
- public_notes:
- type: string
- description: Public notes associated with the project
is_deleted:
+ description: 'Boolean flag determining if the user has been deleted'
type: boolean
- description: A flag indicating if the project is deleted
- number:
+ example: true
+ readOnly: true
+ google_2fa_secret:
+ description: 'The google 2fa secret for the user'
type: string
- description: The project number
- color:
- type: string
- description: The color associated with the project
- required:
- - id
- - user_id
- - name
- - task_rate
- - budgeted_hours
- - is_deleted
- - color
-
- PaymentTerm:
- properties:
- num_days:
- description: 'The payment term length in days'
- type: integer
- example: '1'
- name:
- description: 'The payment term length in string format'
- type: string
- example: 'NET 1'
- created_at:
- description: Timestamp
- type: number
- format: integer
- example: '134341234234'
- updated_at:
- description: Timestamp
- type: number
- format: integer
- example: '134341234234'
- archived_at:
- description: Timestamp
- type: number
- format: integer
- example: '134341234234'
+ example: '123456'
+ readOnly: true
+ company_user:
+ $ref: '#/components/schemas/CompanyUserRef'
type: object
- BankIntegration:
+ UserRef:
properties:
id:
- description: 'The bank integration hashed id'
- type: string
- example: AS3df3A
- user_id:
- description: 'The user hashed id'
- type: string
- example: AS3df3A
- provider_bank_name:
- description: 'The providers bank name'
- type: string
- example: 'Chase Bank'
- bank_account_id:
- description: 'The bank account id'
- type: integer
- example: '1233434'
- bank_account_name:
- description: 'The name of the account'
- type: string
- example: 'My Checking Acc'
- bank_account_number:
- description: 'The account number'
- type: string
- example: '111 234 2332'
- bank_account_status:
- description: 'The status of the bank account'
- type: string
- example: ACTIVE
- bank_account_type:
- description: 'The type of account'
- type: string
- example: CREDITCARD
- balance:
- description: 'The current bank balance if available'
- type: number
- example: '1000000'
- currency:
- description: 'iso_3166_3 code'
- type: string
- example: USD
- type: object
- PurchaseOrder:
- properties:
- id:
- description: 'The unique hashed identifier for the purchase order'
+ description: 'The hashed id of the user'
type: string
example: Opnel5aKBz
- user_id:
- description: 'The unique hashed identifier for the user who created the purchase order'
+ readOnly: true
+ first_name:
+ description: 'The first name of the user'
type: string
- example: ''
- assigned_user_id:
- description: 'The unique hashed identifier for the user assigned to the purchase order'
+ example: Brad
+ last_name:
+ description: 'The last name of the user'
type: string
- example: ''
- vendor_id:
- description: 'The unique hashed identifier for the vendor associated with the purchase order'
+ example: Pitt
+ email:
+ description: 'The users email address'
type: string
- example: ''
- status_id:
- description: 'The status of the purchase order represented by a unique identifier'
+ example: brad@pitt.com
+ phone:
+ description: 'The users phone number'
type: string
- example: ''
- number:
- description: 'The unique alpha-numeric purchase order number per company'
+ example: 555-1233-23232
+ signature:
+ description: 'The users sign off signature'
type: string
- example: PO_101
- quote_number:
- description: 'The quote number associated with this purchase order'
+ example: 'Have a nice day!'
+ avatar:
+ description: 'The users avatar'
type: string
- example: QUOTE_101
- terms:
- description: 'The terms and conditions for the purchase order'
+ example: 'https://url.to.your/avatar.png'
+ accepted_terms_version:
+ description: 'The version of the invoice ninja terms that has been accepted by the user'
type: string
- example: 'These are some purchase order terms. Valid for 14 days.'
- public_notes:
- description: 'Publicly visible notes associated with the purchase order'
+ example: 1.0.1
+ readOnly: true
+ oauth_user_id:
+ description: 'The provider id of the oauth entity'
type: string
- example: 'These are public notes which the vendor may see'
- private_notes:
- description: 'Privately visible notes associated with the purchase order, not disclosed to the vendor'
+ example: jkhasdf789as6f675sdf768sdfs
+ readOnly: true
+ oauth_provider_id:
+ description: 'The oauth entity id'
type: string
- example: 'These are private notes, not to be disclosed to the vendor'
- footer:
- description: 'The footer text of the purchase order'
+ example: google
+ readOnly: true
+ language_id:
+ description: 'The language id of the user'
type: string
- example: 'The text goes in the footer of the purchase order'
+ example: 1
+ verified_phone_number:
+ description: 'Boolean flag if the user has their phone verified. Required to settings up 2FA'
+ type: boolean
+ example: true
+ readOnly: true
+ sms_verification_code:
+ description: 'The sms verification code for the user. Required to settings up 2FA'
+ type: string
+ example: '123456'
+ readOnly: true
+ oauth_user_token_expiry:
+ description: 'The expiry date of the oauth token'
+ type: string
+ example: '2022-10-10'
+ readOnly: true
+ has_password:
+ description: 'Boolean flag determining if the user has a password'
+ type: boolean
+ example: true
+ readOnly: true
+ last_confirmed_email_address:
+ description: 'The last confirmed email address of the user'
+ type: string
+ example: 'bob@gmail.com'
+ readOnly: true
custom_value1:
- description: 'First custom value field for additional information'
+ description: 'A custom value'
type: string
- example: 'A custom value'
+ example: 'Custom value 1'
custom_value2:
- description: 'Second custom value field for additional information'
+ description: 'A custom value'
type: string
- example: 'A custom value'
+ example: '$1000'
custom_value3:
- description: 'Third custom value field for additional information'
+ description: 'A custom value'
type: string
- example: 'A custom value'
+ example: 'Custom value 3'
custom_value4:
- description: 'Fourth custom value field for additional information'
+ description: 'A custom value'
type: string
- example: 'A custom value'
- tax_name1:
- description: 'The name of the first tax applied to the purchase order'
- type: string
- example: GST
- tax_name2:
- description: 'The name of the second tax applied to the purchase order'
- type: string
- example: VAT
- tax_rate1:
- description: 'The rate of the first tax applied to the purchase order'
- type: number
- format: float
- example: 10.00
- tax_rate2:
- description: 'The rate of the second tax applied to the purchase order'
- type: number
- format: float
- example: 10.00
- tax_name3:
- description: 'The name of the third tax applied to the purchase order'
- type: string
- example: ''
- tax_rate3:
- description: 'The rate of the third tax applied to the purchase order'
- type: number
- format: float
- example: 10.00
- total_taxes:
- description: 'The total amount of taxes applied to the purchase order'
- type: number
- format: float
- example: 10.00
- line_items:
- type: array
- description: 'An array of objects which define the line items of the purchase order'
- items:
- $ref: '#/components/schemas/InvoiceItem'
- amount:
- description: 'The total amount of the purchase order before taxes and discounts'
- type: number
- format: float
- example: 10.00
- balance:
- description: 'The balance due for the purchase order after accounting for payments'
- type: number
- format: float
- example: 10.00
- paid_to_date:
- description: 'The total amount paid on the purchase order so far'
- type: number
- format: float
- example: 10.00
- discount:
- description: 'The discount amount or percentage applied to the purchase order'
- type: number
- format: float
- example: 10.00
- partial:
- description: 'The partial or deposit amount for the purchase order'
- type: number
- format: float
- example: 10.00
- is_amount_discount:
- description: 'Boolean flag indicating if the discount is a fixed amount or a percentage'
- type: boolean
- example: true
+ example: 'Custom value 4'
is_deleted:
- description: 'Boolean flag indicating if the purchase order has been deleted'
- type: boolean
- example: false
- uses_inclusive_taxes:
- description: 'Boolean flag indicating if the taxes used are inclusive or exclusive'
+ description: 'Boolean flag determining if the user has been deleted'
type: boolean
example: true
- date:
- description: 'The date the purchase order was created'
+ readOnly: true
+ google_2fa_secret:
+ description: 'The google 2fa secret for the user'
type: string
- format: date
- example: '1994-07-30'
- last_sent_date:
- description: 'The last date the purchase order was sent to the vendor'
- type: string
- format: date
- example: '1994-07-30'
- next_send_date:
- description: 'The next scheduled date for sending a reminder for the purchase order'
- type: string
- format: date
- example: '1994-07-30'
- partial_due_date:
- description: 'The due date for the partial or deposit amount'
- type: string
- format: date
- example: '1994-07-30'
- due_date:
- description: 'The due date for the total amount of the purchase order'
- type: string
- format: date
- example: '1994-07-30'
- settings:
- $ref: '#/components/schemas/CompanySettings'
- last_viewed:
- description: Timestamp
- type: number
- format: integer
- example: 1434342123
- updated_at:
- description: Timestamp
- type: number
- format: integer
- example: 1434342123
- archived_at:
- description: Timestamp
- type: number
- format: integer
- example: 1434342123
- custom_surcharge1:
- description: 'First custom surcharge amount for the purchase order'
- type: number
- format: float
- example: 10.00
- custom_surcharge2:
- description: 'Second custom surcharge amount for the purchase order'
- type: number
- format: float
- example: 10.00
- custom_surcharge3:
- description: 'Third custom surcharge amount for the purchase order'
- type: number
- format: float
- example: 10.00
- custom_surcharge4:
- description: 'Fourth custom surcharge amount for the purchase order'
- type: number
- format: float
- example: 10.00
- custom_surcharge_tax1:
- description: 'Boolean flag indicating if taxes are charged on the first custom surcharge amount'
- type: boolean
- example: true
- custom_surcharge_tax2:
- description: 'Boolean flag indicating if taxes are charged on the second custom surcharge amount'
- type: boolean
- example: true
- custom_surcharge_tax3:
- description: 'Boolean flag indicating if taxes are charged on the third custom surcharge amount'
- type: boolean
- example: true
- custom_surcharge_tax4:
- description: 'Boolean flag indicating if taxes are charged on the fourth custom surcharge amount'
- type: boolean
- example: true
- type: object
-
-
- CompanyLedger:
- properties:
- entity_id:
- description: 'This field will reference one of the following entity hashed ID payment_id, invoice_id or credit_id'
- type: string
- example: AS3df3A
- notes:
- description: 'The notes which reference this entry of the ledger'
- type: string
- example: 'Credit note for invoice #3212'
- balance:
- description: 'The client balance'
- type: number
- format: float
- example: '10.00'
- adjustment:
- description: 'The amount the client balance is adjusted by'
- type: number
- format: float
- example: '10.00'
- updated_at:
- description: Timestamp
- type: number
- format: integer
- example: '1434342123'
- created_at:
- description: Timestamp
- type: number
- format: integer
- example: '1434342123'
+ example: '123456'
+ readOnly: true
type: object
Task:
properties:
@@ -18341,1160 +15348,102 @@ components:
example: '1434342123'
readOnly: true
type: object
- ClientContact:
+ Document:
properties:
id:
- description: 'The hashed if of the contact'
+ description: 'The document hashed id'
type: string
- example: Opnel5aKBz
- readOnly: true
- user_id:
- description: 'The hashed id of the user who created the contact'
- type: string
- example: Opnel5aKBz
- readOnly: true
- client_id:
- description: 'The hashed id of the client'
- type: string
- example: Opnel5aKBz
- readOnly: true
- first_name:
- description: 'The first name of the contact'
- type: string
- example: John
- last_name:
- description: 'The last name of the contact'
- type: string
- example: Doe
- phone:
- description: 'The phone number of the contact'
- type: string
- example: 555-152-4524
- custom_value1:
- description: 'A Custom field value'
- type: string
- example: ''
- custom_value2:
- description: 'A Custom field value'
- type: string
- example: ''
- custom_value3:
- description: 'A Custom field value'
- type: string
- example: ''
- custom_value4:
- description: 'A Custom field value'
- type: string
- example: ''
- email:
- description: 'The email of the contact'
- type: string
- example: ''
- accepted_terms_version:
- description: 'The terms of service which the contact has accpeted'
- type: string
- example: 'A long set of ToS'
- readOnly: true
- password:
- description: 'The hashed password of the contact'
- type: string
- example: '*****'
- confirmation_code:
- description: 'The confirmation code used to authenticate the contacts email address'
- type: string
- example: 333-sdjkh34gbasd
- readOnly: true
- token:
- description: 'A uuid based token.'
- type: string
- example: 333-sdjkh34gbasd
- readOnly: true
- contact_key:
- description: 'A unique identifier for the contact'
- type: string
- example: JD0X52bkfZlJRiroCJ0tcSiAjsJTntZ5uqKdiZ0a
- readOnly: true
- is_primary:
- description: 'Defines is this contact is the primary contact for the client'
- type: boolean
- example: true
- confirmed:
- description: 'Boolean value confirms the user has confirmed their account.'
- type: boolean
- example: true
- is_locked:
- description: 'Boolean value defines if the contact has been locked out.'
- type: boolean
- example: true
- send_email:
- description: 'Boolean value determines is this contact should receive emails'
- type: boolean
- example: true
- failed_logins:
- description: 'The number of failed logins the contact has had'
- type: number
- format: integer
- example: '3'
- readOnly: true
- email_verified_at:
- description: 'The date which the contact confirmed their email'
- type: number
- format: integer
- example: '134341234234'
- readOnly: true
- last_login:
- description: Timestamp
- type: number
- format: integer
- example: '134341234234'
- readOnly: true
- created_at:
- description: Timestamp
- type: number
- format: integer
- example: '134341234234'
- readOnly: true
- updated_at:
- description: Timestamp
- type: number
- format: integer
- example: '134341234234'
- readOnly: true
- deleted_at:
- description: Timestamp
- type: number
- format: integer
- example: '134341234234'
- readOnly: true
- type: object
- ClientContactRequest:
- properties:
- id:
- description: 'The hashed if of the contact'
- type: string
- example: Opnel5aKBz
- readOnly: true
- first_name:
- description: 'The first name of the contact'
- type: string
- example: John
- last_name:
- description: 'The last name of the contact'
- type: string
- example: Doe
- phone:
- description: 'The phone number of the contact'
- type: string
- example: 555-152-4524
- custom_value1:
- description: 'A Custom field value'
- type: string
- example: ''
- custom_value2:
- description: 'A Custom field value'
- type: string
- example: ''
- custom_value3:
- description: 'A Custom field value'
- type: string
- example: ''
- custom_value4:
- description: 'A Custom field value'
- type: string
- example: ''
- email:
- description: 'The email of the contact'
- type: string
- example: ''
- password:
- description: 'The hashed password of the contact'
- type: string
- example: '*****'
- send_email:
- description: 'Boolean value determines is this contact should receive emails'
- type: boolean
- example: true
- type: object
- VendorContact:
- properties:
- id:
- description: 'The hashed id of the vendor contact'
- type: string
- example: Opnel5aKBz
- readOnly: true
- user_id:
- description: 'The hashed id of the user id'
- type: string
- example: Opnel5aKBz
- readOnly: true
- vendor_id:
- description: 'The hashed id of the vendor'
- type: string
- example: Opnel5aKBz
- readOnly: true
- first_name:
- description: 'The first name of the contact'
- type: string
- example: Harry
- last_name:
- description: 'The last name of the contact'
- type: string
- example: Windsor
- contact_key:
- description: 'A unique identifier for the contact'
- type: string
- example: JD0X52bkfZlJRiroCJ0tcSiAjsJTntZ5uqKdiZ0a
- readOnly: true
- confirmation_code:
- description: 'The confirmation code used to authenticate the contacts email address'
- type: string
- example: 333-sdjkh34gbasd
- readOnly: true
- phone:
- description: 'The contacts phone number'
- type: string
- example: 555-123-1234
- custom_value1:
- description: 'A custom value'
- type: string
- example: '2022-10-10'
- custom_value2:
- description: 'A custom value'
- type: string
- example: $1000
- custom_value3:
- description: 'A custom value'
- type: string
- example: ''
- custom_value4:
- description: 'A custom value'
- type: string
- example: ''
- email:
- description: 'The contact email address'
- type: string
- example: harry@windsor.com
- email_verified_at:
- description: 'The date which the contact confirmed their email'
- type: number
- format: integer
- example: '134341234234'
- readOnly: true
- password:
- description: 'The hashed password of the contact'
- type: string
- example: '*****'
- is_primary:
- description: 'Boolean flag determining if the contact is the primary contact for the vendor'
- type: boolean
- example: true
- created_at:
- description: Timestamp
- type: number
- format: integer
- example: '134341234234'
- readOnly: true
- updated_at:
- description: Timestamp
- type: number
- format: integer
- example: '134341234234'
- readOnly: true
- deleted_at:
- description: Timestamp
- type: number
- format: integer
- example: '134341234234'
- readOnly: true
- type: object
- Subscription:
- properties:
- id:
- description: Unique identifier for the subscription
- type: string
- example: Opnel5aKBz
- user_id:
- description: Unique identifier for the user associated with the subscription
- type: string
- example: Ua6Rw4pVbS
- product_id:
- description: Unique identifier for the product associated with the subscription
- type: string
- example: Pr5Ft7yBmC
- recurring_invoice_id:
- description: Unique identifier for the recurring invoice associated with the subscription
- type: string
- example: Ri2Yt8zJkP
- is_recurring:
- description: Indicates whether the subscription is recurring
- type: boolean
- example: 'true'
- frequency_id:
- description: 'integer const representation of the frequency'
- type: string
- example: '1'
- auto_bill:
- description: 'enum setting'
- type: string
- example: always
- promo_code:
- description: Promotional code applied to the subscription
- type: string
- example: PROMOCODE4U
- promo_discount:
- description: Discount percentage or amount applied to the subscription
- type: number
- example: 10
- is_amount_discount:
- description: Indicates whether the discount is a fixed amount
- type: boolean
- example: 'true'
- allow_cancellation:
- description: Indicates whether the subscription can be cancelled
- type: boolean
- example: 'true'
- per_seat_enabled:
- description: Indicates whether the subscription pricing is per seat
- type: boolean
- example: 'true'
- currency_id:
- description: Unique identifier for the currency used in the subscription
- type: integer
- example: '1'
- max_seats_limit:
- description: Maximum number of seats allowed for the subscription
- type: integer
- example: '100'
- trial_enabled:
- description: Indicates whether the subscription has a trial period
- type: boolean
- example: 'true'
- trial_duration:
- description: Duration of the trial period in days
- type: integer
- example: '14'
- allow_query_overrides:
- description: Indicates whether query overrides are allowed for the subscription
- type: boolean
- example: 'true'
- allow_plan_changes:
- description: Indicates whether plan changes are allowed for the subscription
- type: boolean
- example: 'true'
- refund_period:
- description: Number of days within which refunds can be requested
- type: integer
- example: '30'
- webhook_configuration:
- description: Webhook configuration for the subscription
- type: string
- example: 'expand reference for this'
- is_deleted:
- description: Indicates whether the subscription has been deleted
- type: boolean
- example: 'false'
- archived_at:
- description: Timestamp
- type: number
- format: integer
- example: '1434342123'
- created_at:
- description: Timestamp
- type: number
- format: integer
- example: '134341234234'
- updated_at:
- description: Timestamp
- type: number
- format: integer
- example: '134341234234'
- type: object
- BulkAction:
- type: array
- items:
- type: integer
- example: '[0,1,2,3,]'
- BTRules:
- properties:
- data_key:
- description: 'The key to search'
- type: string
- example: 'description,amount'
- operator:
- description: 'The operator flag of the search'
- type: string
- example: '>'
- value:
- description: 'The value to search for'
- type: string
- example: bob
- type: object
- Company:
- properties:
- id:
- description: "The unique hashed identifier for the company"
- type: string
- example: WJxbojagwO
- size_id:
- description: "The unique identifier representing the company's size category"
- type: string
- example: '2'
- industry_id:
- description: "The unique identifier representing the company's industry category"
- type: string
- example: '5'
- slack_webhook_url:
- description: "The URL for the company's Slack webhook notifications"
- type: string
- example: 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX'
- google_analytics_key:
- description: "The company's Google Analytics tracking ID"
- type: string
- example: 'UA-123456789-1'
- portal_mode:
- description: "The mode determining how client-facing URLs are structured (e.g., subdomain, domain, or iframe)"
- type: string
- example: subdomain
- subdomain:
- description: "The subdomain prefix for the company's domain (e.g., 'acme' in acme.domain.com)"
- type: string
- example: acme
- portal_domain:
- description: "The fully qualified domain used for client-facing URLs"
- type: string
- example: 'https://subdomain.invoicing.co'
- enabled_tax_rates:
- description: "The number of tax rates used per entity"
- type: integer
- example: '2'
- fill_products:
- description: "A flag determining whether to auto-fill product descriptions based on the product key"
- type: boolean
- example: true
- convert_products:
- description: "A flag determining whether to convert products between different types or units"
- type: boolean
- example: true
- update_products:
- description: "A flag determining whether to update product descriptions when the description changes"
- type: boolean
- example: true
- show_product_details:
- description: "A flag determining whether to display product details in the user interface"
- type: boolean
- example: true
- show_product_cost:
- description: "A flag determining whether to display product cost is shown in the user interface"
- type: boolean
- example: true
- custom_fields:
- description: "A mapping of custom fields for various objects within the company"
- type: object
- enable_product_cost:
- description: "A flag determining whether to show or hide the product cost field in the user interface"
- type: boolean
- example: true
- enable_product_quantity:
- description: "A flag determining whether to show or hide the product quantity field in the user interface"
- type: boolean
- example: true
- default_quantity:
- description: "A flag determining whether to use a default quantity for products"
- type: boolean
- example: true
- custom_surcharge_taxes1:
- description: "A flag determining whether to apply taxes on custom surcharge amounts for the first custom surcharge field"
- type: boolean
- example: true
- custom_surcharge_taxes2:
- description: "A flag determining whether to apply taxes on custom surcharge amounts for the second custom surcharge field"
- type: boolean
- example: true
- custom_surcharge_taxes3:
- description: "A flag determining whether to apply taxes on custom surcharge amounts for the third custom surcharge field"
- type: boolean
- example: true
- custom_surcharge_taxes4:
- description: "A flag determining whether to apply taxes on custom surcharge amounts for the fourth custom"
- logo:
- description: "The company logo file in binary format"
- type: string
- format: binary
- example: logo.png
- company_key:
- description: "The static company key hash used to identify the Company"
- readOnly: true
- type: string
- example: "Vnb14bRlwiFjc5ckte6cfbygTRkn5IMQ"
- client_can_register:
- description: "A flag determining whether clients can register for the client portal"
- type: boolean
- example: true
- enabled_modules:
- type: integer
- description: |
- Bitmask representation of the modules that are enabled in the application
-
- ```
- self::ENTITY_RECURRING_INVOICE => 1,
- self::ENTITY_CREDIT => 2,
- self::ENTITY_QUOTE => 4,
- self::ENTITY_TASK => 8,
- self::ENTITY_EXPENSE => 16,
- self::ENTITY_PROJECT => 32,
- self::ENTITY_VENDOR => 64,
- self::ENTITY_TICKET => 128,
- self::ENTITY_PROPOSAL => 256,
- self::ENTITY_RECURRING_EXPENSE => 512,
- self::ENTITY_RECURRING_TASK => 1024,
- self::ENTITY_RECURRING_QUOTE => 2048,
- ```
-
- The default per_page value is 20.
-
- example: 2048
- db:
- readOnly: true
- type: string
- example: 'db-ninja-01'
- first_day_of_week:
- description: "The first day of the week for the company"
- type: string
- example: '1'
- first_month_of_year:
- description: "The first month for the company financial year"
- type: string
- example: '1'
- enabled_item_tax_rates:
- description: "The number of tax rates used per item"
- type: integer
- example: 2
- is_large:
- description: "A flag determining whether the company is considered large"
- type: boolean
- example: true
- default_auto_bill:
- type: string
- example: 'always'
- description: |
- A flag determining whether to auto-bill clients by default
-
- values:
-
- - always - Always auto bill
- - disabled - Never auto bill
- - optin - Allow the client to select their auto bill status with the default being disabled
- - optout -Allow the client to select their auto bill status with the default being enabled
- mark_expenses_invoiceable:
- description: "A flag determining whether to mark expenses as invoiceable by default"
- type: boolean
- example: true
- mark_expenses_paid:
- description: "A flag determining whether to mark expenses as paid by default"
- type: boolean
- example: true
- invoice_expense_documents:
- description: "A flag determining whether to include expense documents on invoices by default"
- type: boolean
- example: true
- auto_start_tasks:
- description: "A flag determining whether to auto-start tasks by default"
- type: boolean
- example: true
- invoice_task_timelog:
- description: "A flag determining whether to include task time logs on invoices by default"
- type: boolean
- example: true
- invoice_task_documents:
- description: "A flag determining whether to include task documents on invoices by default"
- type: boolean
- example: true
- show_tasks_table:
- description: "A flag determining whether to show the tasks table on invoices by default"
- type: boolean
- example: true
- is_disabled:
- description: "A flag determining whether the company is disabled"
- type: boolean
- example: true
- default_task_is_date_based:
- description: "A flag determining whether to default tasks to be date-based"
- type: boolean
- example: true
- enable_product_discount:
- description: "A flag determining whether to show or hide the product discount field in the user interface"
- type: boolean
- example: true
- calculate_expense_tax_by_amount:
- description: "A flag determining whether to calculate expense taxes by amount"
- type: boolean
- example: true
- expense_inclusive_taxes:
- description: "A flag determining whether to include taxes in the expense amount"
- type: boolean
- example: true
- session_timeout:
- description: "The session timeout for the company"
- type: integer
- example: 60
- oauth_password_required:
- description: "A flag determining whether to require a password for `dangerous` actions when using OAuth"
- type: boolean
- example: true
- invoice_task_datelog:
- description: "A flag determining whether to include task date logs on invoices by default"
- type: boolean
- example: true
- default_password_timeout:
- description: "The default password timeout for the company"
- type: integer
- example: 60
- show_task_end_date:
- description: "A flag determining whether to show the task end date on invoices by default"
- type: boolean
- example: true
- markdown_enabled:
- description: "A flag determining whether markdown is enabled for the company"
- type: boolean
- example: true
- report_include_drafts:
- description: "A flag determining whether to include draft invoices in reports"
- type: boolean
- example: true
- client_registration_fields:
- description: "The client registration fields for the company"
- type: object
- stop_on_unpaid_recurring:
- description: "A flag determining whether to stop recurring invoices when they are unpaid"
- type: boolean
- example: true
- use_quote_terms_on_conversion:
- description: "A flag determining whether to use quote terms on conversion to an invoice"
- type: boolean
- example: true
- enable_applying_payments:
- description: "A flag determining whether to enable applying payments to invoices"
- type: boolean
- example: true
- track_inventory:
- description: "A flag determining whether to track inventory for the company"
- type: boolean
- example: true
- inventory_notification_threshold:
- description: "The inventory notification threshold for the company"
- type: integer
- example: 60
- stock_notification:
- description: "A flag determining whether to send stock notifications for the company"
- type: boolean
- example: true
- matomo_url:
- description: "The Matomo URL for the company"
- type: string
- example: 'https://matomo.example.com'
- matomo_id:
- description: "The Matomo ID for the company"
- type: string
- example: '1'
- enabled_expense_tax_rates:
- description: "The number of tax rates used per expense"
- type: integer
- example: 2
- invoice_task_project:
- description: "A flag determining whether to include the project on invoices by default"
- type: boolean
- example: true
- report_include_deleted:
- description: "A flag determining whether to include deleted invoices in reports"
- type: boolean
- example: true
- invoice_task_lock:
- description: "A flag determining whether to lock tasks when invoiced"
- type: boolean
- example: true
- convert_payment_currency:
- description: "A flag determining whether to convert the payment currency"
- type: boolean
- example: true
- convert_expense_currency:
- description: "A flag determining whether to convert the expense currency"
- type: boolean
- example: true
- notify_vendor_when_paid:
- description: "A flag determining whether to notify the vendor when an expense is paid"
- type: boolean
- example: true
- invoice_task_hours:
- description: "A flag determining whether to include the task hours on invoices by default"
- type: boolean
- example: true
- calculate_taxes:
- description: "A flag determining whether to calculate taxes for the company"
- type: boolean
- example: true
- tax_data:
- description: "The tax data for the company"
- type: object
- e_invoice_certificate:
- description: "The e-invoice certificate for the company"
- type: string
- example: '-----BEGIN CERTIFICATE-----'
- e_invoice_certificate_passphrase:
- description: "The e-invoice certificate passphrase for the company"
- type: string
- example: 'secret'
- origin_tax_data:
- description: "The origin tax data for the company"
- type: object
- invoice_task_project_header:
- description: "A flag determining whether to include the project header on invoices by default"
- type: boolean
- example: true
- invoice_task_item_description:
- description: "A flag determining whether to include the item description on invoices by default"
- type: boolean
- example: true
-
- settings:
- $ref: '#/components/schemas/CompanySettings'
- type: object
- RecurringInvoice:
- properties:
- id:
- description: 'The hashed id of the recurring invoice'
- type: string
- example: Opnel5aKBz
+ example: AS3df3A
user_id:
description: 'The user hashed id'
type: string
- example: Opnel5aKBz
+ example: ''
assigned_user_id:
description: 'The assigned user hashed id'
type: string
- example: Opnel5aKBz
- client_id:
- description: 'The client hashed id'
- type: string
- example: Opnel5aKBz
- status_id:
- description: 'The invoice status variable'
- type: string
- example: '4'
- frequency_id:
- description: 'The recurring invoice frequency'
- type: number
- example: '4'
- remaining_cycles:
- description: 'The number of invoices left to be generated'
- type: number
- example: '4'
- number:
- description: 'The recurringinvoice number - is a unique alpha numeric number per invoice per company'
- type: string
- example: INV_101
- po_number:
- description: 'The purchase order associated with this recurring invoice'
- type: string
- example: PO-1234
- terms:
- description: 'The invoice terms'
- type: string
- example: 'These are invoice terms'
- public_notes:
- description: 'The public notes of the invoice'
- type: string
- example: 'These are some public notes'
- private_notes:
- description: 'The private notes of the invoice'
- type: string
- example: 'These are some private notes'
- footer:
- description: 'The invoice footer notes'
+ example: ''
+ project_id:
+ description: 'The project associated with this document'
type: string
example: ''
- custom_value1:
- description: 'A custom field value'
- type: string
- example: '2022-10-01'
- custom_value2:
- description: 'A custom field value'
- type: string
- example: 'Something custom'
- custom_value3:
- description: 'A custom field value'
+ vendor_id:
+ description: 'The vendor associated with this documents'
type: string
example: ''
- custom_value4:
- description: 'A custom field value'
+ name:
+ description: 'The document name'
type: string
- example: ''
- tax_name1:
- description: 'The tax name'
+ example: Beauty
+ url:
+ description: 'The document url'
type: string
- example: ''
- tax_name2:
- description: 'The tax name'
+ example: Beauty
+ preview:
+ description: 'The document preview url'
type: string
- example: ''
- tax_rate1:
- description: 'The tax rate'
- type: number
- format: float
- example: '10.00'
- tax_rate2:
- description: 'The tax rate'
- type: number
- format: float
- example: '10.00'
- tax_name3:
- description: 'The tax name'
+ example: Beauty
+ type:
+ description: 'The document type'
type: string
- example: ''
- tax_rate3:
- description: 'The tax rate'
- type: number
- format: float
- example: '10.00'
- total_taxes:
- description: 'The total taxes for the invoice'
- type: number
- format: float
- example: '10.00'
- line_items:
- description: 'An array of objects which define the line items of the invoice'
- type: object
- example: ''
- amount:
- description: 'The invoice amount'
- type: number
- format: float
- example: '10.00'
- balance:
- description: 'The invoice balance'
- type: number
- format: float
- example: '10.00'
- paid_to_date:
- description: 'The amount paid on the invoice to date'
- type: number
- format: float
- example: '10.00'
- discount:
- description: 'The invoice discount, can be an amount or a percentage'
- type: number
- format: float
- example: '10.00'
- partial:
- description: 'The deposit/partial amount'
- type: number
- format: float
- example: '10.00'
- is_amount_discount:
- description: 'Flag determining if the discount is an amount or a percentage'
- type: boolean
- example: true
+ example: Beauty
+ disk:
+ description: 'The document disk'
+ type: string
+ example: Beauty
+ hash:
+ description: 'The document hashed'
+ type: string
+ example: Beauty
is_deleted:
- description: 'Defines if the invoice has been deleted'
+ description: 'Flag to determine if the document is deleted'
type: boolean
example: true
- uses_inclusive_taxes:
- description: 'Defines the type of taxes used as either inclusive or exclusive'
+ is_default:
+ description: 'Flag to determine if the document is a default doc'
type: boolean
example: true
- date:
- description: 'The Invoice Date'
- type: string
- format: date
- example: '1994-07-30'
- last_sent_date:
- description: 'The last date the invoice was sent out'
- type: string
- format: date
- example: '1994-07-30'
- next_send_date:
- description: 'The Next date for a reminder to be sent'
- type: string
- format: date
- example: '1994-07-30'
- partial_due_date:
- description: 'The due date for the deposit/partial amount'
- type: string
- format: date
- example: '1994-07-30'
- due_date:
- description: 'The due date of the invoice'
- type: string
- format: date
- example: '1994-07-30'
- settings:
- $ref: '#/components/schemas/CompanySettings'
- last_viewed:
+ created_at:
description: Timestamp
type: number
format: integer
- example: '1434342123'
+ example: '134341234234'
updated_at:
description: Timestamp
type: number
format: integer
- example: '1434342123'
- archived_at:
+ example: '134341234234'
+ deleted_at:
description: Timestamp
type: number
format: integer
- example: '1434342123'
- custom_surcharge1:
- description: 'First Custom Surcharge'
- type: number
- format: float
- example: '10.00'
- custom_surcharge2:
- description: 'Second Custom Surcharge'
- type: number
- format: float
- example: '10.00'
- custom_surcharge3:
- description: 'Third Custom Surcharge'
- type: number
- format: float
- example: '10.00'
- custom_surcharge4:
- description: 'Fourth Custom Surcharge'
- type: number
- format: float
- example: '10.00'
- custom_surcharge_tax1:
- description: 'Toggles charging taxes on custom surcharge amounts'
- type: boolean
- example: true
- custom_surcharge_tax2:
- description: 'Toggles charging taxes on custom surcharge amounts'
- type: boolean
- example: true
- custom_surcharge_tax3:
- description: 'Toggles charging taxes on custom surcharge amounts'
- type: boolean
- example: true
- custom_surcharge_tax4:
- description: 'Toggles charging taxes on custom surcharge amounts'
- type: boolean
- example: true
+ example: '134341234234'
type: object
-
- Quote:
+ ClientGatewayToken:
properties:
id:
- description: 'The unique hashed identifier for the quote'
+ description: 'The hashed id of the client gateway token'
type: string
example: Opnel5aKBz
- user_id:
- description: 'The unique hashed identifier for the user who created the quote'
- type: string
- example: ''
- assigned_user_id:
- description: 'The unique hashed identifier for the user assigned to the quote'
- type: string
- example: ''
client_id:
- description: 'The unique hashed identifier for the client associated with the quote'
+ description: 'The hashed_id of the client'
type: string
- example: ''
- status_id:
- description: 'The status of the quote represented by a unique identifier'
+ example: '2'
+ token:
+ description: 'The payment token'
type: string
- example: ''
- number:
- description: 'The unique alpha-numeric quote number for the quote per company'
+ example: '2'
+ routing_number:
+ description: 'THe bank account routing number'
type: string
- example: QUOTE_101
- po_number:
- description: 'The purchase order number associated with the quote'
+ example: '2'
+ company_gateway_id:
+ description: 'The hashed id of the company gateway'
type: string
- example: PO-1234
- terms:
- description: 'The terms and conditions for the quote'
- type: string
- example: 'These are some quote terms. Valid for 14 days.'
- public_notes:
- description: 'Publicly visible notes associated with the quote'
- type: string
- example: 'These are public notes which the client may see'
- private_notes:
- description: 'Privately visible notes associated with the quote, not disclosed to the client'
- type: string
- example: 'These are private notes, not to be disclosed to the client'
- footer:
- description: 'The footer text of the quote'
- type: string
- example: 'The text goes in the footer of the quote'
- custom_value1:
- description: 'First custom value field for additional information'
- type: string
- example: 'A custom value'
- custom_value2:
- description: 'Second custom value field for additional information'
- type: string
- example: 'A custom value'
- custom_value3:
- description: 'Third custom value field for additional information'
- type: string
- example: 'A custom value'
- custom_value4:
- description: 'Fourth custom value field for additional information'
- type: string
- example: 'A custom value'
- tax_name1:
- description: 'The name of the first tax applied to the quote'
- type: string
- example: GST
- tax_name2:
- description: 'The name of the second tax applied to the quote'
- type: string
- example: VAT
- tax_rate1:
- description: 'The rate of the first tax applied to the quote'
- type: number
- format: float
- example: 10.00
- tax_rate2:
- description: 'The rate of the second tax applied to the quote'
- type: number
- format: float
- example: 10.00
- tax_name3:
- description: 'The name of the third tax applied to the quote'
- type: string
- example: ''
- tax_rate3:
- description: 'The rate of the third tax applied to the quote'
- type: number
- format: float
- example: 10.00
- total_taxes:
- description: 'The total amount of taxes for the quote'
- type: number
- format: float
- example: 10.00
- line_items:
- type: array
- description: 'An array of objects which define the line items of the quote'
- items:
- $ref: '#/components/schemas/InvoiceItem'
- amount:
- description: 'The total amount of the quote before taxes and discounts'
- type: number
- format: float
- example: 10.00
- balance:
- description: 'The balance due for the quote after accounting for payments'
- type: number
- format: float
- example: 10.00
- paid_to_date:
- description: 'The total amount paid on the quote so far'
- type: number
- format: float
- example: 10.00
- discount:
- description: 'The discount amount or percentage applied to the quote'
- type: number
- format: float
- example: 10.00
- partial:
- description: 'The partial or deposit amount for the quote'
- type: number
- format: float
- example: 10.00
- is_amount_discount:
- description: 'Boolean flag indicating if the discount is a fixed amount or a percentage'
+ example: '2'
+ is_default:
+ description: 'Flag determining if the token is the default payment method'
type: boolean
- example: true
- is_deleted:
- description: 'Boolean flag indicating if the quote has been deleted'
- type: boolean
- example: false
- uses_inclusive_taxes:
- description: 'Boolean flag indicating if the taxes used are inclusive or exclusive'
- type: boolean
- example: true
- date:
- description: 'The date the quote was created'
- type: string
- format: date
- example: '1994-07-30'
- last_sent_date:
- description: 'The last date the quote was sent to the client'
- type: string
- format: date
- example: '1994-07-30'
- next_send_date:
- description: 'The next scheduled date for sending a reminder for the quote'
- type: string
- format: date
- example: '1994-07-30'
- partial_due_date:
- description: 'The due date for the partial or deposit amount'
- type: string
- format: date
- example: '1994-07-30'
- due_date:
- description: 'The due date for the total amount of the quote'
- type: string
- format: date
- example: '1994-07-30'
- settings:
- $ref: '#/components/schemas/CompanySettings'
- last_viewed:
- description: 'The timestamp of the last time the quote was viewed'
- type: number
- format: integer
- example: 1434342123
- updated_at:
- description: 'The timestamp of the last update to the quote'
- type: number
- format: integer
- example: 1434342123
- archived_at:
- description: 'The timestamp of when the quote was archived'
- type: number
- format: integer
- example: 1434342123
- custom_surcharge1:
- description: 'First custom surcharge amount for the quote'
- type: number
- format: float
- example: 10.00
- custom_surcharge2:
- description: 'Second custom surcharge amount for the quote'
- type: number
- format: float
- example: 10.00
- custom_surcharge3:
- description: 'Third custom surcharge amount for the quote'
- type: number
- format: float
- example: 10.00
- custom_surcharge4:
- description: 'Fourth custom surcharge amount for the quote'
- type: number
- format: float
- example: 10.00
- custom_surcharge_tax1:
- description: 'Boolean flag indicating if taxes are charged on the first custom surcharge amount'
- type: boolean
- example: true
- custom_surcharge_tax2:
- description: 'Boolean flag indicating if taxes are charged on the second custom surcharge amount'
- type: boolean
- example: true
- custom_surcharge_tax3:
- description: 'Boolean flag indicating if taxes are charged on the third custom surcharge amount'
- type: boolean
- example: true
- custom_surcharge_tax4:
- description: 'Boolean flag indicating if taxes are charged on the fourth custom surcharge amount'
- type: boolean
- example: true
+ example: 'true'
type: object
Invoice:
properties:
@@ -19732,7 +15681,3734 @@ components:
description: 'The subscription associated with this invoice'
type: string
example: Opnel5aKBz
+
+ type: object
+ FillableInvoice:
+ properties:
+ assigned_user_id:
+ description: "The assigned user's hashed ID"
+ type: string
+ example: 'a1b2c3d4'
+ client_id:
+ description: "The client's hashed ID"
+ type: string
+ example: 'x1y2z3a4'
+ number:
+ description: "The unique alphanumeric invoice number for each invoice per company"
+ type: string
+ example: INV_101
+ po_number:
+ description: "The purchase order number associated with the invoice"
+ type: string
+ example: 'PO12345'
+ terms:
+ description: "The terms and conditions for the invoice"
+ type: string
+ example: 'Net 30'
+ public_notes:
+ description: "Public notes visible to the client on the invoice"
+ type: string
+ example: 'Thank you for your business.'
+ private_notes:
+ description: "Private notes for internal use only"
+ type: string
+ example: 'Client is a slow payer.'
+ footer:
+ description: "The footer text displayed on the invoice"
+ type: string
+ example: 'Authorized Signature'
+ custom_value1:
+ description: "First custom value for additional information"
+ type: string
+ example: 'Project ABC'
+ custom_value2:
+ description: "Second custom value for additional information"
+ type: string
+ example: 'Department XYZ'
+ custom_value3:
+ description: "Third custom value for additional information"
+ type: string
+ example: 'Location 123'
+ custom_value4:
+ description: "Fourth custom value for additional information"
+ type: string
+ example: 'Currency USD'
+ tax_name1:
+ description: "Name of the first tax applied to the invoice"
+ type: string
+ example: 'VAT'
+ tax_name2:
+ description: "Name of the second tax applied to the invoice"
+ type: string
+ example: 'GST'
+ tax_rate1:
+ description: "Rate of the first tax applied to the invoice"
+ type: number
+ example: 10.00
+ tax_rate2:
+ description: "Rate of the second tax applied to the invoice"
+ type: number
+ example: 5.00
+ tax_name3:
+ description: "Name of the third tax applied to the invoice"
+ type: string
+ example: 'PST'
+ tax_rate3:
+ description: "Rate of the third tax applied to the invoice"
+ type: number
+ example: 8.00
+ line_items:
+ type: array
+ description: 'An array of objects which define the line items of the invoice'
+ items:
+ $ref: '#/components/schemas/InvoiceItem'
+ discount:
+ description: "The discount applied to the invoice"
+ type: number
+ example: 10.00
+ partial:
+ description: "The partial amount applied to the invoice"
+ type: number
+ example: 20.00
+ is_amount_discount:
+ description: "Indicates whether the discount applied is a fixed amount or a percentage"
+ type: boolean
+ example: true
+ uses_inclusive_taxes:
+ description: "Indicates whether the tax rates applied to the invoice are inclusive or exclusive"
+ type: boolean
+ example: true
+ date:
+ description: "The date the invoice was issued"
+ type: string
+ example: '1994-07-30'
+ partial_due_date:
+ description: "The due date for the partial payment"
+ type: string
+ example: '1994-08-15'
+ due_date:
+ description: "The due date for the invoice"
+ type: string
+ example: '1994-08-30'
+ custom_surcharge1:
+ description: "First custom surcharge applied to the invoice"
+ type: number
+ example: 10.00
+ custom_surcharge2:
+ description: "Second custom surcharge applied to the invoice"
+ type: number
+ example: 15.00
+ custom_surcharge3:
+ description: "Third custom surcharge applied to the invoice"
+ type: number
+ example: 5.00
+ custom_surcharge4:
+ description: "Fourth custom surcharge applied to the invoice"
+ type: number
+ example: 20.00
+ type: object
+ CompanyGateway:
+ properties:
+ id:
+ description: 'The hashed id of the company gateway'
+ type: string
+ example: Opnel5aKBz
+ gateway_key:
+ description: 'The gateway key (hash)'
+ type: string
+ example: '2'
+ accepted_credit_cards:
+ description: 'Bitmask representation of cards'
+ type: integer
+ example: '32'
+ require_billing_address:
+ description: 'Determines if the the billing address is required prior to payment.'
+ type: boolean
+ example: true
+ require_shipping_address:
+ description: 'Determines if the the billing address is required prior to payment.'
+ type: boolean
+ example: true
+ config:
+ description: 'The configuration map for the gateway'
+ type: string
+ example: dfadsfdsafsafd
+ update_details:
+ description: 'Determines if the client details should be updated.'
+ type: boolean
+ example: true
+ fees_and_limits:
+ description: 'A mapped collection of the fees and limits for the configured gateway'
+ type: array
+ items:
+ $ref: '#/components/schemas/FeesAndLimits'
+ type: object
+
+
+ InvoiceInvitation:
+ properties:
+ id:
+ description: 'The entity invitation hashed id'
+ type: string
+ example: Opnel5aKBz
+ readOnly: true
+ client_contact_id:
+ description: 'The client contact hashed id'
+ type: string
+ example: Opnel5aKBz
+ key:
+ description: 'The invitation key'
+ type: string
+ example: Opnel5aKBz4343343566236gvbb
+ readOnly: true
+ link:
+ description: 'The invitation link'
+ type: string
+ example: 'https://www.example.com/invitations/Opnel5aKBz4343343566236gvbb'
+ readOnly: true
+ sent_date:
+ description: 'The invitation sent date'
+ type: string
+ format: date-time
+ readOnly: true
+ viewed_date:
+ description: 'The invitation viewed date'
+ type: string
+ format: date-time
+ readOnly: true
+ opened_date:
+ description: 'The invitation opened date'
+ type: string
+ format: date-time
+ readOnly: true
+ updated_at:
+ description: 'Timestamp'
+ type: number
+ format: integer
+ example: '1434342123'
+ readOnly: true
+ archived_at:
+ description: 'Timestamp'
+ type: number
+ format: integer
+ example: '1434342123'
+ readOnly: true
+ email_error:
+ description: 'The email error'
+ type: string
+ example: 'The email error'
+ readOnly: true
+ email_status:
+ description: 'The email status'
+ type: string
+ readOnly: true
+ Account:
+ properties:
+ id:
+ description: 'The account hashed id'
+ type: string
+ example: AS3df3A
+ account_sms_verified:
+ description: 'Boolean flag if the account has been verified by sms'
+ type: string
+ example: true
+ type: object
+ ExpenseCategory:
+ properties:
+ id:
+ description: 'The expense hashed id'
+ type: string
+ example: Opnel5aKBz
+ name:
+ description: 'The expense category name'
+ type: string
+ example: Accounting
+ user_id:
+ description: 'The user hashed id'
+ type: string
+ example: XS987sD
+ is_deleted:
+ description: 'Flag determining whether the expense category has been deleted'
+ type: boolean
+ example: true
+ updated_at:
+ description: 'The updated at timestamp'
+ type: integer
+ example: '2'
+ created_at:
+ description: 'The created at timestamp'
+ type: integer
+ example: '2'
+ type: object
+ Subscription:
+ properties:
+ id:
+ description: Unique identifier for the subscription
+ type: string
+ example: Opnel5aKBz
+ user_id:
+ description: Unique identifier for the user associated with the subscription
+ type: string
+ example: Ua6Rw4pVbS
+ product_id:
+ description: Unique identifier for the product associated with the subscription
+ type: string
+ example: Pr5Ft7yBmC
+ recurring_invoice_id:
+ description: Unique identifier for the recurring invoice associated with the subscription
+ type: string
+ example: Ri2Yt8zJkP
+ is_recurring:
+ description: Indicates whether the subscription is recurring
+ type: boolean
+ example: 'true'
+ frequency_id:
+ description: 'integer const representation of the frequency'
+ type: string
+ example: '1'
+ auto_bill:
+ description: 'enum setting'
+ type: string
+ example: always
+ promo_code:
+ description: Promotional code applied to the subscription
+ type: string
+ example: PROMOCODE4U
+ promo_discount:
+ description: Discount percentage or amount applied to the subscription
+ type: number
+ example: 10
+ is_amount_discount:
+ description: Indicates whether the discount is a fixed amount
+ type: boolean
+ example: 'true'
+ allow_cancellation:
+ description: Indicates whether the subscription can be cancelled
+ type: boolean
+ example: 'true'
+ per_seat_enabled:
+ description: Indicates whether the subscription pricing is per seat
+ type: boolean
+ example: 'true'
+ currency_id:
+ description: Unique identifier for the currency used in the subscription
+ type: integer
+ example: '1'
+ max_seats_limit:
+ description: Maximum number of seats allowed for the subscription
+ type: integer
+ example: '100'
+ trial_enabled:
+ description: Indicates whether the subscription has a trial period
+ type: boolean
+ example: 'true'
+ trial_duration:
+ description: Duration of the trial period in days
+ type: integer
+ example: '14'
+ allow_query_overrides:
+ description: Indicates whether query overrides are allowed for the subscription
+ type: boolean
+ example: 'true'
+ allow_plan_changes:
+ description: Indicates whether plan changes are allowed for the subscription
+ type: boolean
+ example: 'true'
+ refund_period:
+ description: Number of days within which refunds can be requested
+ type: integer
+ example: '30'
+ webhook_configuration:
+ description: Webhook configuration for the subscription
+ type: string
+ example: 'expand reference for this'
+ is_deleted:
+ description: Indicates whether the subscription has been deleted
+ type: boolean
+ example: 'false'
+ archived_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ created_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '134341234234'
+ updated_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '134341234234'
+ type: object
+ BulkAction:
+ type: array
+ items:
+ type: integer
+ example: '[0,1,2,3,]'
+ SystemLog:
+ properties:
+ id:
+ description: 'The account hashed id'
+ type: string
+ example: AS3df3A
+ user_id:
+ description: 'The user_id hashed id'
+ type: string
+ example: AS3df3A
+ client_id:
+ description: 'The client_id hashed id'
+ type: string
+ example: AS3df3A
+ event_id:
+ description: 'The Log Type ID'
+ type: integer
+ example: 1
+ category_id:
+ description: 'The Category Type ID'
+ type: integer
+ example: 1
+ type_id:
+ description: 'The Type Type ID'
+ type: integer
+ example: 1
+ log:
+ description: 'The json object of the error'
+ type: object
+ example: '{''key'':''value''}'
+ updated_at:
+ description: Timestamp
+ type: string
+ example: '2'
+ created_at:
+ description: Timestamp
+ type: string
+ example: '2'
+ type: object
+ InvoiceItem:
+ type: object
+ properties:
+ quantity:
+ type: number
+ example: 1
+ description: 'The quantity of the product offered for this line item'
+ cost:
+ type: number
+ format: float
+ example: 10.00
+ description: 'The cost of the product offered for this line item'
+ product_key:
+ type: string
+ example: 'Product key'
+ description: 'The product key of the product offered for this line item (Referred to as Product in the product tab)'
+ product_cost:
+ type: number
+ format: float
+ example: 10.00
+ description: 'The cost of the product offered for this line item (Referred to as Cost in the product tab)'
+ notes:
+ type: string
+ example: 'Item notes'
+ description: 'The notes/description for the product offered for this line item'
+ discount:
+ type: number
+ format: float
+ example: 5.00
+ description: 'The discount applied to the product offered for this line item'
+ is_amount_discount:
+ type: boolean
+ example: false
+ description: 'Indicates whether the discount applied to the product offered for this line item is a fixed amount or a percentage'
+ tax_name1:
+ type: string
+ example: 'GST'
+ description: 'The name of the first tax applied to the product offered for this line item'
+ tax_rate1:
+ type: number
+ format: float
+ example: 10.00
+ description: 'The rate of the first tax applied to the product offered for this line item'
+ tax_name2:
+ type: string
+ example: 'VAT'
+ description: 'The name of the second tax applied to the product offered for this line item'
+ tax_rate2:
+ type: number
+ format: float
+ example: 5.00
+ description: 'The rate of the second tax applied to the product offered for this line item'
+ tax_name3:
+ type: string
+ example: 'CA Sales Tax'
+ description: 'The name of the third tax applied to the product offered for this line item'
+ tax_rate3:
+ type: number
+ format: float
+ example: 3.00
+ description: 'The rate of the third tax applied to the product offered for this line item'
+ sort_id:
+ type: string
+ example: '0'
+ description: 'Deprecated'
+ deprecated: true
+ line_total:
+ type: number
+ format: float
+ example: 10.00
+ description: 'The total amount of the product offered for this line item'
+ readOnly: true
+ gross_line_total:
+ type: number
+ format: float
+ example: 15.00
+ description: 'The total amount of the product offered for this line item before discounts'
+ readOnly: true
+ tax_amount:
+ type: number
+ format: float
+ example: 1.00
+ description: 'The total amount of tax applied to the product offered for this line item'
+ readOnly: true
+ date:
+ type: string
+ format: date-time
+ example: '2023-03-19T00:00:00Z'
+ description: 'Deprecated'
+ deprecated: true
+ custom_value1:
+ type: string
+ example: 'Custom value 1'
+ description: 'The first custom value of the product offered for this line item'
+ custom_value2:
+ type: string
+ example: 'Custom value 2'
+ description: 'The second custom value of the product offered for this line item'
+ custom_value3:
+ type: string
+ example: 'Custom value 3'
+ description: 'The third custom value of the product offered for this line item'
+ custom_value4:
+ type: string
+ example: 'Custom value 4'
+ description: 'The fourth custom value of the product offered for this line item'
+ type_id:
+ type: string
+ example: '1'
+ description: '1 = product, 2 = service, 3 unpaid gateway fee, 4 paid gateway fee, 5 late fee, 6 expense'
+ default: '1'
+ tax_id:
+ type: string
+ example: '1'
+ default: '1'
+ description: 'The tax ID of the product: 1 product, 2 service, 3 digital, 4 shipping, 5 exempt, 5 reduced tax, 7 override, 8 zero rate, 9 reverse tax'
+ PurchaseOrder:
+ properties:
+ id:
+ description: 'The unique hashed identifier for the purchase order'
+ type: string
+ example: Opnel5aKBz
+ user_id:
+ description: 'The unique hashed identifier for the user who created the purchase order'
+ type: string
+ example: ''
+ assigned_user_id:
+ description: 'The unique hashed identifier for the user assigned to the purchase order'
+ type: string
+ example: ''
+ vendor_id:
+ description: 'The unique hashed identifier for the vendor associated with the purchase order'
+ type: string
+ example: ''
+ status_id:
+ description: 'The status of the purchase order represented by a unique identifier'
+ type: string
+ example: ''
+ number:
+ description: 'The unique alpha-numeric purchase order number per company'
+ type: string
+ example: PO_101
+ quote_number:
+ description: 'The quote number associated with this purchase order'
+ type: string
+ example: QUOTE_101
+ terms:
+ description: 'The terms and conditions for the purchase order'
+ type: string
+ example: 'These are some purchase order terms. Valid for 14 days.'
+ public_notes:
+ description: 'Publicly visible notes associated with the purchase order'
+ type: string
+ example: 'These are public notes which the vendor may see'
+ private_notes:
+ description: 'Privately visible notes associated with the purchase order, not disclosed to the vendor'
+ type: string
+ example: 'These are private notes, not to be disclosed to the vendor'
+ footer:
+ description: 'The footer text of the purchase order'
+ type: string
+ example: 'The text goes in the footer of the purchase order'
+ custom_value1:
+ description: 'First custom value field for additional information'
+ type: string
+ example: 'A custom value'
+ custom_value2:
+ description: 'Second custom value field for additional information'
+ type: string
+ example: 'A custom value'
+ custom_value3:
+ description: 'Third custom value field for additional information'
+ type: string
+ example: 'A custom value'
+ custom_value4:
+ description: 'Fourth custom value field for additional information'
+ type: string
+ example: 'A custom value'
+ tax_name1:
+ description: 'The name of the first tax applied to the purchase order'
+ type: string
+ example: GST
+ tax_name2:
+ description: 'The name of the second tax applied to the purchase order'
+ type: string
+ example: VAT
+ tax_rate1:
+ description: 'The rate of the first tax applied to the purchase order'
+ type: number
+ format: float
+ example: 10.00
+ tax_rate2:
+ description: 'The rate of the second tax applied to the purchase order'
+ type: number
+ format: float
+ example: 10.00
+ tax_name3:
+ description: 'The name of the third tax applied to the purchase order'
+ type: string
+ example: ''
+ tax_rate3:
+ description: 'The rate of the third tax applied to the purchase order'
+ type: number
+ format: float
+ example: 10.00
+ total_taxes:
+ description: 'The total amount of taxes applied to the purchase order'
+ type: number
+ format: float
+ example: 10.00
+ line_items:
+ type: array
+ description: 'An array of objects which define the line items of the purchase order'
+ items:
+ $ref: '#/components/schemas/InvoiceItem'
+ amount:
+ description: 'The total amount of the purchase order before taxes and discounts'
+ type: number
+ format: float
+ example: 10.00
+ balance:
+ description: 'The balance due for the purchase order after accounting for payments'
+ type: number
+ format: float
+ example: 10.00
+ paid_to_date:
+ description: 'The total amount paid on the purchase order so far'
+ type: number
+ format: float
+ example: 10.00
+ discount:
+ description: 'The discount amount or percentage applied to the purchase order'
+ type: number
+ format: float
+ example: 10.00
+ partial:
+ description: 'The partial or deposit amount for the purchase order'
+ type: number
+ format: float
+ example: 10.00
+ is_amount_discount:
+ description: 'Boolean flag indicating if the discount is a fixed amount or a percentage'
+ type: boolean
+ example: true
+ is_deleted:
+ description: 'Boolean flag indicating if the purchase order has been deleted'
+ type: boolean
+ example: false
+ uses_inclusive_taxes:
+ description: 'Boolean flag indicating if the taxes used are inclusive or exclusive'
+ type: boolean
+ example: true
+ date:
+ description: 'The date the purchase order was created'
+ type: string
+ format: date
+ example: '1994-07-30'
+ last_sent_date:
+ description: 'The last date the purchase order was sent to the vendor'
+ type: string
+ format: date
+ example: '1994-07-30'
+ next_send_date:
+ description: 'The next scheduled date for sending a reminder for the purchase order'
+ type: string
+ format: date
+ example: '1994-07-30'
+ partial_due_date:
+ description: 'The due date for the partial or deposit amount'
+ type: string
+ format: date
+ example: '1994-07-30'
+ due_date:
+ description: 'The due date for the total amount of the purchase order'
+ type: string
+ format: date
+ example: '1994-07-30'
+ settings:
+ $ref: '#/components/schemas/CompanySettings'
+ last_viewed:
+ description: Timestamp
+ type: number
+ format: integer
+ example: 1434342123
+ updated_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: 1434342123
+ archived_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: 1434342123
+ custom_surcharge1:
+ description: 'First custom surcharge amount for the purchase order'
+ type: number
+ format: float
+ example: 10.00
+ custom_surcharge2:
+ description: 'Second custom surcharge amount for the purchase order'
+ type: number
+ format: float
+ example: 10.00
+ custom_surcharge3:
+ description: 'Third custom surcharge amount for the purchase order'
+ type: number
+ format: float
+ example: 10.00
+ custom_surcharge4:
+ description: 'Fourth custom surcharge amount for the purchase order'
+ type: number
+ format: float
+ example: 10.00
+ custom_surcharge_tax1:
+ description: 'Boolean flag indicating if taxes are charged on the first custom surcharge amount'
+ type: boolean
+ example: true
+ custom_surcharge_tax2:
+ description: 'Boolean flag indicating if taxes are charged on the second custom surcharge amount'
+ type: boolean
+ example: true
+ custom_surcharge_tax3:
+ description: 'Boolean flag indicating if taxes are charged on the third custom surcharge amount'
+ type: boolean
+ example: true
+ custom_surcharge_tax4:
+ description: 'Boolean flag indicating if taxes are charged on the fourth custom surcharge amount'
+ type: boolean
+ example: true
+ type: object
+
+
+ CompanyUser:
+ properties:
+ permissions:
+ description: 'The user permissionsfor this company in a comma separated list'
+ type: string
+ example: 'create_invoice,create_client,view_client'
+ settings:
+ description: 'Settings that are used for the flutter applications to store user preferences / metadata'
+ type: object
+ readOnly: true
+ react_settings:
+ description: 'Dedicated settings object for the react web application'
+ type: object
+ readOnly: true
+ is_owner:
+ description: 'Determines whether the user owns this company'
+ type: boolean
+ example: true
+ readOnly: true
+ is_admin:
+ description: 'Determines whether the user is the admin of this company'
+ type: boolean
+ example: true
+ readOnly: true
+ is_locked:
+ description: 'Determines whether the users access to this company has been locked'
+ type: boolean
+ example: true
+ readOnly: true
+ updated_at:
+ description: 'The last time the record was modified, format Unix Timestamp'
+ type: integer
+ example: '1231232312321'
+ deleted_at:
+ description: 'Timestamp when the user was archived, format Unix Timestamp'
+ type: integer
+ example: '12312312321'
+ account:
+ $ref: '#/components/schemas/Account'
+ company:
+ $ref: '#/components/schemas/Company'
+ user:
+ $ref: '#/components/schemas/UserRef'
+ token:
+ $ref: '#/components/schemas/CompanyToken'
+ type: object
+ CompanyUserRef:
+ properties:
+ permissions:
+ description: 'The user permissionsfor this company in a comma separated list'
+ type: string
+ example: 'create_invoice,create_client,view_client'
+ settings:
+ description: 'Settings that are used for the flutter applications to store user preferences / metadata'
+ type: object
+ readOnly: true
+ react_settings:
+ description: 'Dedicated settings object for the react web application'
+ type: object
+ readOnly: true
+ is_owner:
+ description: 'Determines whether the user owns this company'
+ type: boolean
+ example: true
+ readOnly: true
+ is_admin:
+ description: 'Determines whether the user is the admin of this company'
+ type: boolean
+ example: true
+ readOnly: true
+ is_locked:
+ description: 'Determines whether the users access to this company has been locked'
+ type: boolean
+ example: true
+ readOnly: true
+ updated_at:
+ description: 'The last time the record was modified, format Unix Timestamp'
+ type: integer
+ example: '1231232312321'
+ deleted_at:
+ description: 'Timestamp when the user was archived, format Unix Timestamp'
+ type: integer
+ example: '12312312321'
+ account:
+ $ref: '#/components/schemas/Account'
+ company:
+ $ref: '#/components/schemas/Company'
+ user:
+ $ref: '#/components/schemas/UserRef'
+ token:
+ $ref: '#/components/schemas/CompanyToken'
+ type: object
+ CompanySettings:
+ required:
+ - currency_id
+ properties:
+ currency_id:
+ description: "The default currency id"
+ type: string
+ example: true
+ timezone_id:
+ description: "The timezone id"
+ type: string
+ example: "15"
+ date_format_id:
+ description: "The date format id"
+ type: string
+ example: "15"
+ military_time:
+ description: "Toggles 12/24 hour time"
+ type: boolean
+ example: true
+ language_id:
+ description: "The language id"
+ type: string
+ example: "1"
+ show_currency_code:
+ description: "Toggles whether the currency symbol or code is shown"
+ type: boolean
+ example: true
+ payment_terms:
+ description: "-1 sets no payment term, 0 sets payment due immediately, positive integers indicates payment terms in days"
+ type: integer
+ example: "1"
+ company_gateway_ids:
+ description: "A commad separate list of available gateways"
+ type: string
+ example: "1,2,3,4"
+ custom_value1:
+ description: "A Custom Label"
+ type: string
+ example: "Custom Label"
+ custom_value2:
+ description: "A Custom Label"
+ type: string
+ example: "Custom Label"
+ custom_value3:
+ description: "A Custom Label"
+ type: string
+ example: "Custom Label"
+ custom_value4:
+ description: "A Custom Label"
+ type: string
+ example: "Custom Label"
+ default_task_rate:
+ description: "The default task rate"
+ type: number
+ format: float
+ example: "10.00"
+ send_reminders:
+ description: "Toggles whether reminders are sent"
+ type: boolean
+ example: true
+ enable_client_portal_tasks:
+ description: "Show/hide the tasks panel in the client portal"
+ type: boolean
+ example: true
+ email_style:
+ description: "options include plain,light,dark,custom"
+ type: string
+ example: light
+ reply_to_email:
+ description: "The reply to email address"
+ type: string
+ example: email@gmail.com
+ bcc_email:
+ description: "A comma separate list of BCC emails"
+ type: string
+ example: "email@gmail.com, contact@gmail.com"
+ pdf_email_attachment:
+ description: "Toggles whether to attach PDF as attachment"
+ type: boolean
+ example: true
+ ubl_email_attachment:
+ description: "Toggles whether to attach UBL as attachment"
+ type: boolean
+ example: true
+ email_style_custom:
+ description: "The custom template"
+ type: string
+ example: ""
+ counter_number_applied:
+ description: "enum when the invoice number counter is set, ie when_saved, when_sent, when_paid"
+ type: string
+ example: when_sent
+ quote_number_applied:
+ description: "enum when the quote number counter is set, ie when_saved, when_sent"
+ type: string
+ example: when_sent
+ custom_message_dashboard:
+ description: "A custom message which is displayed on the dashboard"
+ type: string
+ example: "Please pay invoices immediately"
+ custom_message_unpaid_invoice:
+ description: "A custom message which is displayed in the client portal when a client is viewing a unpaid invoice."
+ type: string
+ example: "Please pay invoices immediately"
+ custom_message_paid_invoice:
+ description: "A custom message which is displayed in the client portal when a client is viewing a paid invoice."
+ type: string
+ example: "Thanks for paying this invoice!"
+ custom_message_unapproved_quote:
+ description: "A custom message which is displayed in the client portal when a client is viewing a unapproved quote."
+ type: string
+ example: "Please approve quote"
+ lock_invoices:
+ description: "Toggles whether invoices are locked once sent and cannot be modified further"
+ type: boolean
+ example: true
+ auto_archive_invoice:
+ description: "Toggles whether a invoice is archived immediately following payment"
+ type: boolean
+ example: true
+ auto_archive_quote:
+ description: "Toggles whether a quote is archived after being converted to a invoice"
+ type: boolean
+ example: true
+ auto_convert_quote:
+ description: "Toggles whether a quote is converted to a invoice when approved"
+ type: boolean
+ example: true
+ inclusive_taxes:
+ description: "Boolean flag determining whether inclusive or exclusive taxes are used"
+ type: boolean
+ example: true
+ translations:
+ description: "JSON payload of customized translations"
+ type: object
+ example: ""
+ task_number_pattern:
+ description: "Allows customisation of the task number pattern"
+ type: string
+ example: "{$year}-{$counter}"
+ task_number_counter:
+ description: "The incrementing counter for tasks"
+ type: integer
+ example: "1"
+ reminder_send_time:
+ description: "Time from UTC +0 when the email will be sent to the client"
+ type: integer
+ example: "32400"
+ expense_number_pattern:
+ description: "Allows customisation of the expense number pattern"
+ type: string
+ example: "{$year}-{$counter}"
+ expense_number_counter:
+ description: "The incrementing counter for expenses"
+ type: integer
+ example: "1"
+ vendor_number_pattern:
+ description: "Allows customisation of the vendor number pattern"
+ type: string
+ example: "{$year}-{$counter}"
+ vendor_number_counter:
+ description: "The incrementing counter for vendors"
+ type: integer
+ example: "1"
+ ticket_number_pattern:
+ description: "Allows customisation of the ticket number pattern"
+ type: string
+ example: "{$year}-{$counter}"
+ ticket_number_counter:
+ description: "The incrementing counter for tickets"
+ type: integer
+ example: "1"
+ payment_number_pattern:
+ description: "Allows customisation of the payment number pattern"
+ type: string
+ example: "{$year}-{$counter}"
+ payment_number_counter:
+ description: "The incrementing counter for payments"
+ type: integer
+ example: "1"
+ invoice_number_pattern:
+ description: "Allows customisation of the invoice number pattern"
+ type: string
+ example: "{$year}-{$counter}"
+ invoice_number_counter:
+ description: "The incrementing counter for invoices"
+ type: integer
+ example: "1"
+ quote_number_pattern:
+ description: "Allows customisation of the quote number pattern"
+ type: string
+ example: "{$year}-{$counter}"
+ quote_number_counter:
+ description: "The incrementing counter for quotes"
+ type: integer
+ example: "1"
+ client_number_pattern:
+ description: "Allows customisation of the client number pattern"
+ type: string
+ example: "{$year}-{$counter}"
+ client_number_counter:
+ description: "The incrementing counter for clients"
+ type: integer
+ example: "1"
+ credit_number_pattern:
+ description: "Allows customisation of the credit number pattern"
+ type: string
+ example: "{$year}-{$counter}"
+ credit_number_counter:
+ description: "The incrementing counter for credits"
+ type: integer
+ example: "1"
+ recurring_invoice_number_prefix:
+ description: "This string is prepended to the recurring invoice number"
+ type: string
+ example: R
+ reset_counter_frequency_id:
+ description: "CONSTANT which is used to apply the frequency which the counters are reset"
+ type: integer
+ example: "1"
+ reset_counter_date:
+ description: "The explicit date which is used to reset counters"
+ type: string
+ example: "2019-01-01"
+ counter_padding:
+ description: "Pads the counter with leading zeros"
+ type: integer
+ example: "1"
+ shared_invoice_quote_counter:
+ description: "Flags whether to share the counter for invoices and quotes"
+ type: boolean
+ example: true
+ update_products:
+ description: "Determines if client fields are updated from third party APIs"
+ type: boolean
+ example: true
+ convert_products:
+ description: ""
+ type: boolean
+ example: true
+ fill_products:
+ description: "Automatically fill products based on product_key"
+ type: boolean
+ example: true
+ invoice_terms:
+ description: "The default invoice terms"
+ type: string
+ example: "Invoice Terms are..."
+ quote_terms:
+ description: "The default quote terms"
+ type: string
+ example: "Quote Terms are..."
+ invoice_taxes:
+ description: "Taxes can be applied to the invoice"
+ type: number
+ example: "1"
+ invoice_design_id:
+ description: "The default design id (invoice, quote etc)"
+ type: string
+ example: "1"
+ quote_design_id:
+ description: "The default design id (invoice, quote etc)"
+ type: string
+ example: "1"
+ invoice_footer:
+ description: "The default invoice footer"
+ type: string
+ example: "1"
+ invoice_labels:
+ description: "JSON string of invoice labels"
+ type: string
+ example: "1"
+ tax_rate1:
+ description: "The tax rate (float)"
+ type: number
+ example: "10"
+ tax_name1:
+ description: "The tax name"
+ type: string
+ example: GST
+ tax_rate2:
+ description: "The tax rate (float)"
+ type: number
+ example: "10"
+ tax_name2:
+ description: "The tax name"
+ type: string
+ example: GST
+ tax_rate3:
+ description: "The tax rate (float)"
+ type: number
+ example: "10"
+ tax_name3:
+ description: "The tax name"
+ type: string
+ example: GST
+ payment_type_id:
+ description: "The default payment type id"
+ type: string
+ example: "1"
+ custom_fields:
+ description: "JSON string of custom fields"
+ type: string
+ example: "{}"
+ email_footer:
+ description: "The default email footer"
+ type: string
+ example: "A default email footer"
+ email_sending_method:
+ description: "The email driver to use to send email, options include default, gmail, client_postmark, client_mailgun, client_brevo, office365"
+ type: string
+ example: default
+ gmail_sending_user_id:
+ description: "The hashed_id of the user account to send email from"
+ type: string
+ example: F76sd34D
+ email_subject_invoice:
+ description: ""
+ type: string
+ example: "Your Invoice Subject"
+ email_subject_quote:
+ description: ""
+ type: string
+ example: "Your Quote Subject"
+ email_subject_payment:
+ description: ""
+ type: string
+ example: "Your Payment Subject"
+ email_template_invoice:
+ description: "The full template for invoice emails"
+ type: string
+ example: ""
+ email_template_quote:
+ description: "The full template for quote emails"
+ type: string
+ example: ""
+ email_template_payment:
+ description: "The full template for payment emails"
+ type: string
+ example: ""
+ email_subject_reminder1:
+ description: "Email subject for Reminder"
+ type: string
+ example: ""
+ email_subject_reminder2:
+ description: "Email subject for Reminder"
+ type: string
+ example: ""
+ email_subject_reminder3:
+ description: "Email subject for Reminder"
+ type: string
+ example: ""
+ email_subject_reminder_endless:
+ description: "Email subject for endless reminders"
+ type: string
+ example: ""
+ email_template_reminder1:
+ description: "The full template for Reminder 1"
+ type: string
+ example: ""
+ email_template_reminder2:
+ description: "The full template for Reminder 2"
+ type: string
+ example: ""
+ email_template_reminder3:
+ description: "The full template for Reminder 3"
+ type: string
+ example: ""
+ email_template_reminder_endless:
+ description: "The full template for enless reminders"
+ type: string
+ example: ""
+ enable_portal_password:
+ description: "Toggles whether a password is required to log into the client portal"
+ type: boolean
+ example: true
+ show_accept_invoice_terms:
+ description: "Toggles whether the terms dialogue is shown to the client"
+ type: boolean
+ example: true
+ show_accept_quote_terms:
+ description: "Toggles whether the terms dialogue is shown to the client"
+ type: boolean
+ example: true
+ require_invoice_signature:
+ description: "Toggles whether a invoice signature is required"
+ type: boolean
+ example: true
+ require_quote_signature:
+ description: "Toggles whether a quote signature is required"
+ type: boolean
+ example: true
+ name:
+ description: "The company name"
+ type: string
+ example: "Acme Co"
+ company_logo:
+ description: "The company logo file"
+ type: object
+ example: logo.png
+ website:
+ description: "The company website URL"
+ type: string
+ example: www.acme.com
+ address1:
+ description: "The company address line 1"
+ type: string
+ example: "Suite 888"
+ address2:
+ description: "The company address line 2"
+ type: string
+ example: "5 Jimbo Way"
+ city:
+ description: "The company city"
+ type: string
+ example: Sydney
+ state:
+ description: "The company state"
+ type: string
+ example: Florisa
+ postal_code:
+ description: "The company zip/postal code"
+ type: string
+ example: "90210"
+ phone:
+ description: "The company phone"
+ type: string
+ example: 555-213-3948
+ email:
+ description: "The company email"
+ type: string
+ example: joe@acme.co
+ country_id:
+ description: "The country ID"
+ type: string
+ example: "1"
+ vat_number:
+ description: "The company VAT/TAX ID number"
+ type: string
+ example: "32 120 377 720"
+ page_size:
+ description: "The default page size"
+ type: string
+ example: A4
+ font_size:
+ description: "The font size"
+ type: number
+ example: "9"
+ primary_font:
+ description: "The primary font"
+ type: string
+ example: roboto
+ secondary_font:
+ description: "The secondary font"
+ type: string
+ example: roboto
+ hide_paid_to_date:
+ description: "Flags whether to hide the paid to date field"
+ type: boolean
+ example: false
+ embed_documents:
+ description: "Toggled whether to embed documents in the PDF"
+ type: boolean
+ example: false
+ all_pages_header:
+ description: "The header for the PDF"
+ type: boolean
+ example: false
+ all_pages_footer:
+ description: "The footer for the PDF"
+ type: boolean
+ example: false
+ document_email_attachment:
+ description: "Toggles whether to attach documents in the email"
+ type: boolean
+ example: false
+ enable_client_portal_password:
+ description: "Toggles password protection of the client portal"
+ type: boolean
+ example: false
+ enable_email_markup:
+ description: "Toggles the use of markdown in emails"
+ type: boolean
+ example: false
+ enable_client_portal_dashboard:
+ description: "Toggles whether the client dashboard is shown in the client portal"
+ type: boolean
+ example: false
+ enable_client_portal:
+ description: "Toggles whether the entire client portal is displayed to the client, or only the context"
+ type: boolean
+ example: false
+ email_template_statement:
+ description: "The body of the email for statements"
+ type: string
+ example: "template matter"
+ email_subject_statement:
+ description: "The subject of the email for statements"
+ type: string
+ example: "subject matter"
+ signature_on_pdf:
+ description: "Toggles whether the signature (if available) is displayed on the PDF"
+ type: boolean
+ example: false
+ quote_footer:
+ description: "The default quote footer"
+ type: string
+ example: "the quote footer"
+ email_subject_custom1:
+ description: "Custom reminder template subject"
+ type: string
+ example: "Custom Subject 1"
+ email_subject_custom2:
+ description: "Custom reminder template subject"
+ type: string
+ example: "Custom Subject 2"
+ email_subject_custom3:
+ description: "Custom reminder template subject"
+ type: string
+ example: "Custom Subject 3"
+ email_template_custom1:
+ description: "Custom reminder template body"
+ type: string
+ example: ""
+ email_template_custom2:
+ description: "Custom reminder template body"
+ type: string
+ example: ""
+ email_template_custom3:
+ description: "Custom reminder template body"
+ type: string
+ example: ""
+ enable_reminder1:
+ description: "Toggles whether this reminder is enabled"
+ type: boolean
+ example: false
+ enable_reminder2:
+ description: "Toggles whether this reminder is enabled"
+ type: boolean
+ example: false
+ enable_reminder3:
+ description: "Toggles whether this reminder is enabled"
+ type: boolean
+ example: false
+ num_days_reminder1:
+ description: "The Reminder interval"
+ type: number
+ example: "9"
+ num_days_reminder2:
+ description: "The Reminder interval"
+ type: number
+ example: "9"
+ num_days_reminder3:
+ description: "The Reminder interval"
+ type: number
+ example: "9"
+ schedule_reminder1:
+ description: "(enum: after_invoice_date, before_due_date, after_due_date)"
+ type: string
+ example: after_invoice_date
+ schedule_reminder2:
+ description: "(enum: after_invoice_date, before_due_date, after_due_date)"
+ type: string
+ example: after_invoice_date
+ schedule_reminder3:
+ description: "(enum: after_invoice_date, before_due_date, after_due_date)"
+ type: string
+ example: after_invoice_date
+ late_fee_amount1:
+ description: "The late fee amount for reminder 1"
+ type: number
+ example: 10
+ late_fee_amount2:
+ description: "The late fee amount for reminder 2"
+ type: number
+ example: 20
+ late_fee_amount3:
+ description: "The late fee amount for reminder 2"
+ type: number
+ example: 100
+ endless_reminder_frequency_id:
+ description: "The frequency id of the endless reminder"
+ type: string
+ example: "1"
+ client_online_payment_notification:
+ description: "Determines if a client should receive the notification for a online payment"
+ type: boolean
+ example: false
+ client_manual_payment_notification:
+ description: "Determines if a client should receive the notification for a manually entered payment"
+ type: boolean
+ example: false
+ enable_e_invoice:
+ description: "Determines if e-invoicing is enabled"
+ type: boolean
+ example: false
+ default_expense_payment_type_id:
+ description: "The default payment type for expenses"
+ type: string
+ example: "0"
+ e_invoice_type:
+ description: "The e-invoice type"
+ type: string
+ example: "EN16931"
+ mailgun_endpoint:
+ description: "The mailgun endpoint - used to determine whether US or EU endpoints are used"
+ type: string
+ example: "api.mailgun.net or api.eu.mailgun.net"
+ client_initiated_payments:
+ description: "Determines if clients can initiate payments directly from the client portal"
+ type: boolean
+ example: false
+ client_initiated_payments_minimum:
+ description: "The minimum amount a client can pay"
+ type: number
+ example: 10
+ sync_invoice_quote_columns:
+ description: "Determines if invoice and quote columns are synced for the PDF rendering, or if they use their own columns"
+ type: boolean
+ example: false
+ show_task_item_description:
+ description: "Determines if the task item description is shown on the invoice"
+ type: boolean
+ example: false
+ allow_billable_task_items:
+ description: "Determines if task items can be marked as billable"
+ type: boolean
+ example: false
+ accept_client_input_quote_approval:
+ description: "Determines if clients can approve quotes and also pass through a PO Number reference"
+ type: boolean
+ example: false
+ custom_sending_email:
+ description: "When using Mailgun or Postmark, the FROM email address can be customized using this setting."
+ type: string
+ example: "bob@gmail.com"
+ show_paid_stamp:
+ description: "Determines if the PAID stamp is shown on the invoice"
+ type: boolean
+ example: false
+ show_shipping_address:
+ description: "Determines if the shipping address is shown on the invoice"
+ type: boolean
+ example: false
+ company_logo_size:
+ description: "The size of the company logo on the PDF - percentage value between 0 and 100"
+ type: number
+ example: 100
+ show_email_footer:
+ description: "Determines if the email footer is shown on emails"
+ type: boolean
+ example: false
+ email_alignment:
+ description: "The alignment of the email body text, options include left / center / right"
+ type: string
+ example: "left"
+ auto_bill_standard_invoices:
+ description: "Determines if standard invoices are automatically billed when they are created or due"
+ type: boolean
+ example: false
+ postmark_secret:
+ description: "The Postmark secret API key"
+ type: string
+ example: "123456"
+ mailgun_secret:
+ description: "The Mailgun secret API key"
+ type: string
+ example: "123456"
+ mailgun_domain:
+ description: "The Mailgun domain"
+ type: string
+ example: "sandbox123456.mailgun.org"
+ send_email_on_mark_paid:
+ description: "Determines if an email is sent when an invoice is marked as paid"
+ type: boolean
+ example: false
+ vendor_portal_enable_uploads:
+ description: "Determines if vendors can upload files to the portal"
+ type: boolean
+ example: false
+ besr_id:
+ description: "The BESR ID"
+ type: string
+ example: "123456"
+ qr_iban:
+ description: "The IBAN for the QR code"
+ type: string
+ example: "CH123456"
+ email_subject_purchase_order:
+ description: "The email subject for purchase orders"
+ type: string
+ example: "Purchase Order"
+ email_template_purchase_order:
+ description: "The email template for purchase orders"
+ type: string
+ example: "Please see attached your purchase order."
+ require_purchase_order_signature:
+ description: "Determines if a signature is required on purchase orders"
+ type: boolean
+ example: false
+ purchase_order_public_notes:
+ description: "The public notes for purchase orders"
+ type: string
+ example: "Please see attached your purchase order."
+ purchase_order_terms:
+ description: "The terms for purchase orders"
+ type: string
+ example: "Please see attached your purchase order."
+ purchase_order_footer:
+ description: "The footer for purchase orders"
+ type: string
+ example: "Please see attached your purchase order."
+ purchase_order_design_id:
+ description: "The design id for purchase orders"
+ type: string
+ example: "hd677df"
+ purchase_order_number_pattern:
+ description: "The pattern for purchase order numbers"
+ type: string
+ example: "PO-000000"
+ purchase_order_number_counter:
+ description: "The counter for purchase order numbers"
+ type: number
+ example: 1
+ page_numbering_alignment:
+ description: "The alignment for page numbering: options include left / center / right"
+ type: string
+ example: "left"
+ page_numbering:
+ description: "Determines if page numbering is enabled on Document PDFs"
+ type: boolean
+ example: false
+ auto_archive_invoice_cancelled:
+ description: "Determines if invoices are automatically archived when they are cancelled"
+ type: boolean
+ example: false
+ email_from_name:
+ description: "The FROM name for emails when using Custom emailers"
+ type: string
+ example: "Bob Smith"
+ show_all_tasks_client_portal:
+ description: "Determines if all tasks are shown on the client portal"
+ type: boolean
+ example: false
+ entity_send_time:
+ description: "The time that emails are sent. The time is localized to the clients locale, integer values from 1 - 24"
+ type: integer
+ example: 9
+ shared_invoice_credit_counter:
+ description: "Determines if the invoice and credit counter are shared"
+ type: boolean
+ example: false
+ reply_to_name:
+ description: "The reply to name for emails"
+ type: string
+ example: "Bob Smith"
+ hide_empty_columns_on_pdf:
+ description: "Determines if empty columns are hidden on PDFs"
+ type: boolean
+ example: false
+ enable_reminder_endless:
+ description: "Determines if endless reminders are enabled"
+ type: boolean
+ example: false
+ use_credits_payment:
+ description: "Determines if credits can be used as a payment method"
+ type: boolean
+ example: false
+ recurring_invoice_number_pattern:
+ description: "The pattern for recurring invoice numbers"
+ type: string
+ example: "R-000000"
+ recurring_invoice_number_counter:
+ description: "The counter for recurring invoice numbers"
+ type: number
+ example: 1
+ client_portal_under_payment_minimum:
+ description: "The minimum payment payment"
+ type: number
+ example: 10
+ auto_bill_date:
+ description: "Determines when the invoices are auto billed, options are on_send_date (when the invoice is sent) or on_due_date (when the invoice is due))"
+ type: string
+ example: "on_send_date"
+ primary_color:
+ description: "The primary color for the client portal / document highlights"
+ type: string
+ example: "#ffffff"
+ secondary_color:
+ description: "The secondary color for the client portal / document highlights"
+ type: string
+ example: "#ffffff"
+ client_portal_allow_under_payment:
+ description: "Determines if clients can pay invoices under the invoice amount due"
+ type: boolean
+ example: false
+ client_portal_allow_over_payment:
+ description: "Determines if clients can pay invoices over the invoice amount"
+ type: boolean
+ example: false
+ auto_bill:
+ description: "Determines how autobilling is applied for recurring invoices. off (no auto billed), always (always auto bill), optin (The user must opt in to auto billing), optout (The user must opt out of auto billing"
+ type: string
+ example: "off"
+ client_portal_terms:
+ description: "The terms which are displayed on the client portal"
+ type: string
+ example: "Please see attached your invoice."
+ client_portal_privacy_policy:
+ description: "The privacy policy which is displayed on the client portal"
+ type: string
+ example: "These are the terms of use for using the client portal."
+ client_can_register:
+ description: "Determines if clients can register on the client portal"
+ type: boolean
+ example: false
+ portal_design_id:
+ description: "The design id for the client portal"
+ type: string
+ example: "hd677df"
+ late_fee_endless_percent:
+ description: "The late fee percentage for endless late fees"
+ type: number
+ example: 10
+ late_fee_endless_amount:
+ description: "The late fee amount for endless late fees"
+ type: number
+ example: 10
+ auto_email_invoice:
+ description: "Determines if invoices are automatically emailed when they are created"
+ type: boolean
+ example: false
+ email_signature:
+ description: "The email signature for emails"
+ type: string
+ example: "Bob Smith"
+ classification:
+ description: "The classification for the company"
+ type: string
+ example: "individual"
+ type: object
+
+ CompanyLedger:
+ properties:
+ entity_id:
+ description: 'This field will reference one of the following entity hashed ID payment_id, invoice_id or credit_id'
+ type: string
+ example: AS3df3A
+ notes:
+ description: 'The notes which reference this entry of the ledger'
+ type: string
+ example: 'Credit note for invoice #3212'
+ balance:
+ description: 'The client balance'
+ type: number
+ format: float
+ example: '10.00'
+ adjustment:
+ description: 'The amount the client balance is adjusted by'
+ type: number
+ format: float
+ example: '10.00'
+ updated_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ created_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ type: object
+ CompanyToken:
+ properties:
+ name:
+ description: 'The token name'
+ type: string
+ example: 'Token Name'
+ token:
+ description: 'The token value'
+ type: string
+ example: AS3df3jUUH765fhfd9KJuidj3JShjA
+ is_system:
+ description: 'Determines whether the token is created by the system rather than a user'
+ type: boolean
+ example: 'true'
+ type: object
+ Activity:
+ properties:
+ id:
+ description: 'The id field of the activity'
+ type: string
+ example: Opnel5aKBz
+ activity_type_id:
+ description: 'The activity type id'
+ type: string
+ example: Opnel5aKBz
+ client_id:
+ description: 'The client hashed id'
+ type: string
+ example: Opnel5aKBz
+ company_id:
+ description: 'The company hashed id'
+ type: string
+ example: Opnel5aKBz
+ user_id:
+ description: 'The user hashed id'
+ type: string
+ example: Opnel5aKBz
+ invoice_id:
+ description: 'The invoice hashed id'
+ type: string
+ example: Opnel5aKBz
+ payment_id:
+ description: 'The payment hashed id'
+ type: string
+ example: Opnel5aKBz
+ credit_id:
+ description: 'The credit hashed id'
+ type: string
+ example: Opnel5aKBz
+ updated_at:
+ description: 'Unixtimestamp the last time the record was updated'
+ type: integer
+ example: '343421434'
+ expense_id:
+ description: 'The expense hashed id'
+ type: string
+ example: Opnel5aKBz
+ is_system:
+ description: 'Defines is the activity was performed by the system'
+ type: boolean
+ example: true
+ contact_id:
+ description: 'The contact hashed id'
+ type: string
+ example: Opnel5aKBz
+ task_id:
+ description: 'The task hashed id'
+ type: string
+ example: Opnel5aKBz
+ notes:
+ description: 'Activity Notes'
+ type: string
+ example: Opnel5aKBz
+ token_id:
+ description: 'The hashed ID of the token who performed the action'
+ type: string
+ example: Opnel5aKBz
+ ip:
+ description: 'The IP Address of the user who performed the action'
+ type: string
+ example: 192.168.1.252
+ user:
+ $ref: '#/components/schemas/User'
+ client:
+ $ref: '#/components/schemas/Client'
+ contact:
+ $ref: '#/components/schemas/ClientContact'
+ recurring_invoice:
+ $ref: '#/components/schemas/RecurringInvoice'
+ invoice:
+ $ref: '#/components/schemas/Invoice'
+ credit:
+ $ref: '#/components/schemas/Credit'
+ quote:
+ $ref: '#/components/schemas/Quote'
+ payment:
+ $ref: '#/components/schemas/Payment'
+ expense:
+ $ref: '#/components/schemas/Expense'
+ task:
+ $ref: '#/components/schemas/Task'
+ purchase_order:
+ $ref: '#/components/schemas/PurchaseOrder'
+ vendor:
+ $ref: '#/components/schemas/Vendor'
+ vendor_contact:
+ $ref: '#/components/schemas/VendorContact'
+ type: object
+ Error:
+ properties:
+ message:
+ description: 'Something terrible went wrong'
+ type: string
+ example: 'Unexpected error'
+ code:
+ description: 'The HTTP error code, ie 5xx 4xx'
+ type: integer
+ example: '500'
+ type: object
+
+ GenericBulkAction:
+ properties:
+ action:
+ type: string
+ example: archive
+ description: 'The action to perform ie. archive / restore / delete'
+ ids:
+ type: array
+ items:
+ format: string
+ type: string
+ example: 2J234DFA,D2J234DFA,D2J234DFA
+ description: string array of client hashed ids
+ type: object
+ ClientContact:
+ properties:
+ id:
+ description: 'The hashed if of the contact'
+ type: string
+ example: Opnel5aKBz
+ readOnly: true
+ user_id:
+ description: 'The hashed id of the user who created the contact'
+ type: string
+ example: Opnel5aKBz
+ readOnly: true
+ client_id:
+ description: 'The hashed id of the client'
+ type: string
+ example: Opnel5aKBz
+ readOnly: true
+ first_name:
+ description: 'The first name of the contact'
+ type: string
+ example: John
+ last_name:
+ description: 'The last name of the contact'
+ type: string
+ example: Doe
+ phone:
+ description: 'The phone number of the contact'
+ type: string
+ example: 555-152-4524
+ custom_value1:
+ description: 'A Custom field value'
+ type: string
+ example: ''
+ custom_value2:
+ description: 'A Custom field value'
+ type: string
+ example: ''
+ custom_value3:
+ description: 'A Custom field value'
+ type: string
+ example: ''
+ custom_value4:
+ description: 'A Custom field value'
+ type: string
+ example: ''
+ email:
+ description: 'The email of the contact'
+ type: string
+ example: ''
+ accepted_terms_version:
+ description: 'The terms of service which the contact has accpeted'
+ type: string
+ example: 'A long set of ToS'
+ readOnly: true
+ password:
+ description: 'The hashed password of the contact'
+ type: string
+ example: '*****'
+ confirmation_code:
+ description: 'The confirmation code used to authenticate the contacts email address'
+ type: string
+ example: 333-sdjkh34gbasd
+ readOnly: true
+ token:
+ description: 'A uuid based token.'
+ type: string
+ example: 333-sdjkh34gbasd
+ readOnly: true
+ contact_key:
+ description: 'A unique identifier for the contact'
+ type: string
+ example: JD0X52bkfZlJRiroCJ0tcSiAjsJTntZ5uqKdiZ0a
+ readOnly: true
+ is_primary:
+ description: 'Defines is this contact is the primary contact for the client'
+ type: boolean
+ example: true
+ confirmed:
+ description: 'Boolean value confirms the user has confirmed their account.'
+ type: boolean
+ example: true
+ is_locked:
+ description: 'Boolean value defines if the contact has been locked out.'
+ type: boolean
+ example: true
+ send_email:
+ description: 'Boolean value determines is this contact should receive emails'
+ type: boolean
+ example: true
+ failed_logins:
+ description: 'The number of failed logins the contact has had'
+ type: number
+ format: integer
+ example: '3'
+ readOnly: true
+ email_verified_at:
+ description: 'The date which the contact confirmed their email'
+ type: number
+ format: integer
+ example: '134341234234'
+ readOnly: true
+ last_login:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '134341234234'
+ readOnly: true
+ created_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '134341234234'
+ readOnly: true
+ updated_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '134341234234'
+ readOnly: true
+ deleted_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '134341234234'
+ readOnly: true
+ type: object
+ Project:
+ type: object
+ properties:
+ id:
+ description: 'The project hashed id'
+ type: string
+ example: Opnel5aKBz
+ user_id:
+ description: 'The user hashed id'
+ type: string
+ example: Opnel5aKBz
+ assigned_user_id:
+ description: The assigned user identifier associated with the project
+ type: string
+ example: Opnel5aKBz
+ client_id:
+ type: string
+ example: Opnel5aKBz
+ description: The client identifier associated with the project
+ name:
+ type: string
+ description: The name of the project
+ example: 'New Project'
+ task_rate:
+ type: number
+ format: float
+ example: 10
+ description: The default rate per task for the project
+ due_date:
+ type: string
+ format: date
+ example: '2019-01-01'
+ description: The due date for the project
+ private_notes:
+ type: string
+ description: Private notes associated with the project
+ budgeted_hours:
+ type: number
+ format: float
+ description: The number of budgeted hours for the project
+ custom_value1:
+ type: string
+ description: Custom value field 1
+ custom_value2:
+ type: string
+ description: Custom value field 2
+ custom_value3:
+ type: string
+ description: Custom value field 3
+ custom_value4:
+ type: string
+ description: Custom value field 4
+ created_at:
+ type: number
+ format: integer
+ example: 134341234234
+ description: The timestamp of the project creation
+ updated_at:
+ type: number
+ format: integer
+ example: 134341234234
+ description: The timestamp of the last project update
+ archived_at:
+ type: number
+ format: integer
+ example: 134341234234
+ description: The timestamp of the project deletion
+ public_notes:
+ type: string
+ description: Public notes associated with the project
+ is_deleted:
+ type: boolean
+ description: A flag indicating if the project is deleted
+ number:
+ type: string
+ description: The project number
+ color:
+ type: string
+ description: The color associated with the project
+ required:
+ - id
+ - user_id
+ - name
+ - task_rate
+ - budgeted_hours
+ - is_deleted
+ - color
+
+ Credit:
+ properties:
+ id:
+ description: "The unique hashed ID of the credit"
+ type: string
+ example: Opnel5aKBz
+ user_id:
+ description: "The unique hashed ID of the user associated with the credit"
+ type: string
+ example: 1a2b3c4d5e
+ assigned_user_id:
+ description: "The unique hashed ID of the assigned user responsible for the credit"
+ type: string
+ example: 6f7g8h9i0j
+ client_id:
+ description: "The unique hashed ID of the client associated with the credit"
+ type: string
+ example: p1q2r3s4t5
+ status_id:
+ description: "The ID representing the current status of the credit"
+ type: string
+ example: 3
+ invoice_id:
+ description: "The unique hashed ID of the linked invoice to which the credit is applied"
+ type: string
+ example: u1v2w3x4y5
+ number:
+ description: "The unique alphanumeric credit number per company"
+ type: string
+ example: QUOTE_101
+ po_number:
+ description: "The purchase order number referred to by the credit"
+ type: string
+ example: PO_12345
+ terms:
+ description: "The terms associated with the credit"
+ type: string
+ example: "Net 30"
+ public_notes:
+ description: "Public notes for the credit"
+ type: string
+ example: "Thank you for your business."
+ private_notes:
+ description: "Private notes for internal use, not visible to the client"
+ type: string
+ example: "Client is requesting a discount."
+ footer:
+ description: "The footer text for the credit"
+ type: string
+ example: "Footer text goes here."
+ custom_value1:
+ description: "Custom value 1 for additional credit information"
+ type: string
+ example: "Custom data 1"
+ custom_value2:
+ description: "Custom value 2 for additional credit information"
+ type: string
+ example: "Custom data 2"
+ custom_value3:
+ description: "Custom value 3 for additional credit information"
+ type: string
+ example: "Custom data 3"
+ custom_value4:
+ description: "Custom value 4 for additional credit information"
+ type: string
+ example: "Custom data 4"
+ tax_name1:
+ description: "The name of the first tax applied to the credit"
+ type: string
+ example: "VAT"
+ tax_name2:
+ description: "The name of the second tax applied to the credit"
+ type: string
+ example: "GST"
+ tax_rate1:
+ description: "The rate of the first tax applied to the credit"
+ type: number
+ format: float
+ example: 10.00
+ tax_rate2:
+ description: "The rate of the second tax applied to the credit"
+ type: number
+ format: float
+ example: 5.00
+ tax_name3:
+ description: "The name of the third tax applied to the credit"
+ type: string
+ example: "PST"
+ tax_rate3:
+ description: "The rate of the third tax applied to the credit"
+ type: number
+ format: float
+ example: 8.00
+ total_taxes:
+ description: "The total amount of taxes for the credit"
+ type: number
+ format: float
+ example: 23.00
+ line_items:
+ type: array
+ description: 'An array of objects which define the line items of the credit'
+ items:
+ $ref: '#/components/schemas/InvoiceItem'
+ amount:
+ description: "The total amount of the credit"
+ type: number
+ format: float
+ example: 100.00
+ balance:
+ description: "The outstanding balance of the credit"
+ type: number
+ format: float
+ example: 50.00
+ paid_to_date:
+ description: "The total amount paid to date for the credit"
+ type: number
+ format: float
+ example: 50.00
+ discount:
+ description: "The discount applied to the credit"
+ type: number
+ format: float
+ example: 10.00
+ partial:
+ description: "The partial amount applied to the credit"
+ type: number
+ format: float
+ example: 20.00
+ is_amount_discount:
+ description: "Indicates whether the discount applied is a fixed amount or a percentage"
+ type: boolean
+ example: true
+ is_deleted:
+ description: "Indicates whether the credit has been deleted"
+ type: boolean
+ example: false
+ uses_inclusive_taxes:
+ description: "Indicates whether the tax rates applied to the credit are inclusive or exclusive"
+ type: boolean
+ example: true
+ date:
+ description: "The date the credit was issued"
+ type: string
+ format: date
+ example: "1994-07-30"
+ last_sent_date:
+ description: "The date the credit was last sent out"
+ type: string
+ format: date
+ example: "1994-07-30"
+ next_send_date:
+ description: "The next scheduled date for sending a credit reminder"
+ type: string
+ format: date
+ example: "1994-07-30"
+ partial_due_date:
+ description: "The due date for the partial amount of the credit"
+ type: string
+ format: date
+ example: "1994-07-30"
+ due_date:
+ description: "The due date for the total amount of the credit"
+ type: string
+ format: date
+ example: "1994-07-30"
+ settings:
+ $ref: "#/components/schemas/CompanySettings"
+ last_viewed:
+ description: "The timestamp of the last time the credit was viewed"
+ type: number
+ format: integer
+ example: 1434342123
+ updated_at:
+ description: "The timestamp of the last time the credit was updated"
+ type: number
+ format: integer
+ example: 1434342123
+ archived_at:
+ description: "The timestamp of the last time the credit was archived"
+ type: number
+ format: integer
+ example: 1434342123
+ custom_surcharge1:
+ description: "First custom surcharge amount"
+ type: number
+ format: float
+ example: 10.00
+ custom_surcharge2:
+ description: 'Second Custom Surcharge'
+ type: number
+ format: float
+ example: '10.00'
+ custom_surcharge3:
+ description: 'Third Custom Surcharge'
+ type: number
+ format: float
+ example: '10.00'
+ custom_surcharge4:
+ description: 'Fourth Custom Surcharge'
+ type: number
+ format: float
+ example: '10.00'
+ custom_surcharge_tax1:
+ description: 'Toggles charging taxes on custom surcharge amounts'
+ type: boolean
+ example: true
+ custom_surcharge_tax2:
+ description: 'Toggles charging taxes on custom surcharge amounts'
+ type: boolean
+ example: true
+ custom_surcharge_tax3:
+ description: 'Toggles charging taxes on custom surcharge amounts'
+ type: boolean
+ example: true
+ custom_surcharge_tax4:
+ description: 'Toggles charging taxes on custom surcharge amounts'
+ type: boolean
+ example: true
+ type: object
+
+ ProductBulkAction:
+ required:
+ - action
+ - ids
+ properties:
+ action:
+ type: string
+ example: archive
+ description: 'The action to perform ie. archive / restore / delete / set_tax_id'
+ ids:
+ type: array
+ items:
+ format: string
+ type: string
+ example: 2J234DFA,D2J234DFA,D2J234DFA
+ description: string array of client hashed ids
+ tax_id:
+ type: string
+ example: '1'
+ description: |
+ The tax rate id to set on the list of products
+
+ The following constants are available (default = '1')
+
+ ```
+ PRODUCT_TYPE_PHYSICAL = '1'
+ PRODUCT_TYPE_SERVICE = '2'
+ PRODUCT_TYPE_DIGITAL = '3'
+ PRODUCT_TYPE_SHIPPING = '4'
+ PRODUCT_TYPE_EXEMPT = '5'
+ PRODUCT_TYPE_REDUCED_TAX = '6'
+ PRODUCT_TYPE_OVERRIDE_TAX = '7'
+ PRODUCT_TYPE_ZERO_RATED = '8'
+ PRODUCT_TYPE_REVERSE_TAX = '9'
+ ```
+ type: object
+ Payment:
+ properties:
+ id:
+ description: 'The payment hashed id'
+ type: string
+ example: Opnel5aKBz
+ client_id:
+ description: 'The client hashed id'
+ type: string
+ example: Opnel5aKBz
+ invitation_id:
+ description: 'The invitation hashed id'
+ type: string
+ example: Opnel5aKBz
+ client_contact_id:
+ description: 'The client contact hashed id'
+ type: string
+ example: Opnel5aKBz
+ user_id:
+ description: 'The user hashed id'
+ type: string
+ example: Opnel5aKBz
+ type_id:
+ description: 'The Payment Type ID'
+ type: string
+ example: '1'
+ date:
+ description: 'The Payment date'
+ type: string
+ example: 1-1-2014
+ transaction_reference:
+ description: 'The transaction reference as defined by the payment gateway'
+ type: string
+ example: xcsSxcs124asd
+ assigned_user_id:
+ description: 'The assigned user hashed id'
+ type: string
+ example: Opnel5aKBz
+ private_notes:
+ description: 'The private notes of the payment'
+ type: string
+ example: 'The payment was refunded due to error'
+ is_manual:
+ description: 'Flags whether the payment was made manually or processed via a gateway'
+ type: boolean
+ example: true
+ is_deleted:
+ description: 'Defines if the payment has been deleted'
+ type: boolean
+ example: true
+ amount:
+ description: 'The amount of this payment'
+ type: number
+ example: 10
+ refunded:
+ description: 'The refunded amount of this payment'
+ type: number
+ example: 10
+ updated_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ archived_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ company_gateway_id:
+ description: 'The company gateway id'
+ type: string
+ example: '3'
+ paymentables:
+ $ref: '#/components/schemas/Paymentable'
+ invoices:
+ description: ''
+ type: array
+ items:
+ $ref: '#/components/schemas/InvoicePaymentable'
+ credits:
+ description: ''
+ type: array
+ items:
+ $ref: '#/components/schemas/CreditPaymentable'
+ number:
+ description: 'The payment number - is a unique alpha numeric number per payment per company'
+ type: string
+ example: PAY_101
+ type: object
+
+ BankTransactionRule:
+ properties:
+ id:
+ description: 'The bank transaction rules hashed id'
+ type: string
+ example: AS3df3A
+ user_id:
+ description: 'The user hashed id'
+ type: string
+ example: AS3df3A
+ name:
+ description: 'The name of the transaction'
+ type: string
+ example: 'Rule 1'
+ rules:
+ description: 'A mapped collection of the sub rules for the BankTransactionRule'
+ type: array
+ items:
+ $ref: '#/components/schemas/BTRules'
+ auto_convert:
+ description: 'Flags whether the rule converts the transaction automatically'
+ type: boolean
+ example: true
+ matches_on_all:
+ description: 'Flags whether all subrules are required for the match'
+ type: boolean
+ example: true
+ applies_to:
+ description: 'Flags whether the rule applies to a CREDIT or DEBIT'
+ type: string
+ example: CREDIT
+ client_id:
+ description: 'The client hashed id'
+ type: string
+ example: AS3df3A
+ vendor_id:
+ description: 'The vendor hashed id'
+ type: string
+ example: AS3df3A
+ category_id:
+ description: 'The category hashed id'
+ type: string
+ example: AS3df3A
+ type: object
+ RecurringExpense:
+ properties:
+ id:
+ description: 'The hashed id of the recurring expense'
+ type: string
+ example: Opnel5aKBz
+ user_id:
+ description: 'The hashed id of the user who created the recurring expense'
+ type: string
+ example: Opnel5aKBz
+ assigned_user_id:
+ description: 'The hashed id of the user assigned to this recurring expense'
+ type: string
+ example: Opnel5aKBz
+ client_id:
+ description: 'The hashed id of the client'
+ type: string
+ example: Opnel5aKBz
+ invoice_id:
+ description: 'The hashed id of the invoice'
+ type: string
+ example: Opnel5aKBz
+ bank_id:
+ description: 'The id of the bank associated with this recurring expense'
+ type: string
+ example: '22'
+ invoice_currency_id:
+ description: 'The currency id of the invoice associated with this recurring expense'
+ type: string
+ example: '1'
+ expense_currency_id:
+ description: 'The currency id of the expense associated with this recurring expense'
+ type: string
+ example: '1'
+ invoice_category_id:
+ description: 'The category id of the invoice'
+ type: string
+ example: '1'
+ payment_type_id:
+ description: 'The payment type id'
+ type: string
+ example: '1'
+ private_notes:
+ description: 'The recurring expense private notes'
+ type: string
+ example: 'Private and confidential'
+ public_notes:
+ description: 'The recurring expense public notes'
+ type: string
+ example: 'This is the best client in the world'
+ transaction_reference:
+ description: 'The recurring expense transaction reference'
+ type: string
+ example: EXP-1223-2333
+ transcation_id:
+ description: 'The transaction id of the recurring expense'
+ type: string
+ example: '1233312312'
+ custom_value1:
+ description: 'Custom value field'
+ type: string
+ example: $1000
+ custom_value2:
+ description: 'Custom value field'
+ type: string
+ example: '2022-10-10'
+ custom_value3:
+ description: 'Custom value field'
+ type: string
+ example: 'short text'
+ custom_value4:
+ description: 'Custom value field'
+ type: string
+ example: 'very long text'
+ tax_name1:
+ description: 'The tax name'
+ type: string
+ example: GST
+ tax_name2:
+ description: 'The tax name'
+ type: string
+ example: VAT
+ tax_rate1:
+ description: 'The tax rate'
+ type: number
+ format: float
+ example: '10.00'
+ tax_rate2:
+ description: 'The tax rate'
+ type: number
+ format: float
+ example: '10.00'
+ tax_name3:
+ description: 'The tax name'
+ type: string
+ example: ''
+ tax_rate3:
+ description: 'The tax rate'
+ type: number
+ format: float
+ example: '10.00'
+ amount:
+ description: 'The total amount of the recurring expense'
+ type: number
+ format: float
+ example: '10.00'
+ frequency_id:
+ description: 'The frequency this recurring expense fires'
+ type: number
+ format: int
+ example: '1'
+ remaining_cycles:
+ description: 'The number of remaining cycles for this recurring expense'
+ type: number
+ format: int
+ example: '1'
+ foreign_amount:
+ description: 'The foreign currency amount of the recurring expense'
+ type: number
+ format: float
+ example: '10.00'
+ exchange_rate:
+ description: 'The exchange rate for the expernse'
+ type: number
+ format: float
+ example: '0.80'
+ date:
+ description: 'The date of the expense'
+ type: string
+ example: ''
+ payment_date:
+ description: 'The date the expense was paid'
+ type: string
+ example: ''
+ should_be_invoiced:
+ description: 'Boolean flag determining if the expense should be invoiced'
+ type: boolean
+ example: true
+ is_deleted:
+ description: 'Boolean flag determining if the recurring expense is deleted'
+ type: boolean
+ example: true
+ last_sent_date:
+ description: 'The Date it was sent last'
+ type: string
+ format: date
+ example: '1994-07-30'
+ next_send_date:
+ description: 'The next send date'
+ type: string
+ format: date
+ example: '1994-07-30'
+ invoice_documents:
+ description: 'Boolean flag determining if the documents associated with this expense should be passed onto the invoice if it is converted to an invoice'
+ type: boolean
+ example: true
+ updated_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ archived_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ type: object
+ InvoiceRequest:
+ required:
+ - client_id
+ properties:
+ id:
+ description: 'The invoice hashed id'
+ type: string
+ example: Opnel5aKBz
+ readOnly: true
+ user_id:
+ description: 'The user hashed id'
+ type: string
+ example: Opnel5aKBz
+ assigned_user_id:
+ description: 'The assigned user hashed id'
+ type: string
+ example: Opnel5aKBz
+ client_id:
+ description: 'The client hashed id'
+ type: string
+ example: Opnel5aKBz
+ status_id:
+ description: 'The invoice status variable'
+ type: string
+ example: '4'
+ readOnly: true
+ number:
+ description: 'The invoice number - is a unique alpha numeric number per invoice per company'
+ type: string
+ example: INV_101
+ po_number:
+ description: 'The purchase order associated with this invoice'
+ type: string
+ example: PO-1234
+ terms:
+ description: 'The invoice terms'
+ type: string
+ example: 'These are invoice terms'
+ public_notes:
+ description: 'The public notes of the invoice'
+ type: string
+ example: 'These are some public notes'
+ private_notes:
+ description: 'The private notes of the invoice'
+ type: string
+ example: 'These are some private notes'
+ footer:
+ description: 'The invoice footer notes'
+ type: string
+ example: ''
+ custom_value1:
+ description: 'A custom field value'
+ type: string
+ example: '2022-10-01'
+ custom_value2:
+ description: 'A custom field value'
+ type: string
+ example: 'Something custom'
+ custom_value3:
+ description: 'A custom field value'
+ type: string
+ example: ''
+ custom_value4:
+ description: 'A custom field value'
+ type: string
+ example: ''
+ tax_name1:
+ description: 'The tax name'
+ type: string
+ example: ''
+ tax_name2:
+ description: 'The tax name'
+ type: string
+ example: ''
+ tax_rate1:
+ description: 'The tax rate'
+ type: number
+ format: float
+ example: '10.00'
+ tax_rate2:
+ description: 'The tax rate'
+ type: number
+ format: float
+ example: '10.00'
+ tax_name3:
+ description: 'The tax name'
+ type: string
+ example: ''
+ tax_rate3:
+ description: 'The tax rate'
+ type: number
+ format: float
+ example: '10.00'
+ total_taxes:
+ description: 'The total taxes for the invoice'
+ type: number
+ format: float
+ example: '10.00'
+ readOnly: true
+ line_items:
+ type: array
+ description: 'An array of objects which define the line items of the invoice'
+ items:
+ $ref: '#/components/schemas/InvoiceItem'
+ invitations:
+ type: array
+ description: 'An array of objects which define the invitations of the invoice'
+ items:
+ $ref: '#/components/schemas/InvoiceInvitationRequest'
+ amount:
+ description: 'The invoice amount'
+ type: number
+ format: float
+ example: '10.00'
+ readOnly: true
+ balance:
+ description: 'The invoice balance'
+ type: number
+ format: float
+ example: '10.00'
+ readOnly: true
+ paid_to_date:
+ description: 'The amount paid on the invoice to date'
+ type: number
+ format: float
+ example: '10.00'
+ readOnly: true
+ discount:
+ description: 'The invoice discount, can be an amount or a percentage'
+ type: number
+ format: float
+ example: '10.00'
+ partial:
+ description: 'The deposit/partial amount'
+ type: number
+ format: float
+ example: '10.00'
+ is_amount_discount:
+ description: 'Flag determining if the discount is an amount or a percentage'
+ type: boolean
+ example: true
+ is_deleted:
+ description: 'Defines if the invoice has been deleted'
+ type: boolean
+ example: true
+ readOnly: true
+ uses_inclusive_taxes:
+ description: 'Defines the type of taxes used as either inclusive or exclusive'
+ type: boolean
+ example: true
+ date:
+ description: 'The Invoice Date'
+ type: string
+ format: date
+ example: '1994-07-30'
+ last_sent_date:
+ description: 'The last date the invoice was sent out'
+ type: string
+ format: date
+ example: '1994-07-30'
+ readOnly: true
+ next_send_date:
+ description: 'The Next date for a reminder to be sent'
+ type: string
+ format: date
+ example: '1994-07-30'
+ readOnly: true
+ partial_due_date:
+ description: 'The due date for the deposit/partial amount'
+ type: string
+ format: date
+ example: '1994-07-30'
+ due_date:
+ description: 'The due date of the invoice'
+ type: string
+ format: date
+ example: '1994-07-30'
+ last_viewed:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ readOnly: true
+ updated_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ readOnly: true
+ archived_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ readOnly: true
+ custom_surcharge1:
+ description: 'First Custom Surcharge'
+ type: number
+ format: float
+ example: '10.00'
+ custom_surcharge2:
+ description: 'Second Custom Surcharge'
+ type: number
+ format: float
+ example: '10.00'
+ custom_surcharge3:
+ description: 'Third Custom Surcharge'
+ type: number
+ format: float
+ example: '10.00'
+ custom_surcharge4:
+ description: 'Fourth Custom Surcharge'
+ type: number
+ format: float
+ example: '10.00'
+ custom_surcharge_tax1:
+ description: 'Toggles charging taxes on custom surcharge amounts'
+ type: boolean
+ example: true
+ custom_surcharge_tax2:
+ description: 'Toggles charging taxes on custom surcharge amounts'
+ type: boolean
+ example: true
+ custom_surcharge_tax3:
+ description: 'Toggles charging taxes on custom surcharge amounts'
+ type: boolean
+ example: true
+ custom_surcharge_tax4:
+ description: 'Toggles charging taxes on custom surcharge amounts'
+ type: boolean
+ example: true
+ project_id:
+ description: 'The project associated with this invoice'
+ type: string
+ example: Opnel5aKBz
+ type: object
+ RecurringQuote:
+ properties:
+ id:
+ description: 'The hashed id of the recurring quote'
+ type: string
+ example: Opnel5aKBz
+ user_id:
+ description: 'The user hashed id'
+ type: string
+ example: Opnel5aKBz
+ assigned_user_id:
+ description: 'The assigned user hashed id'
+ type: string
+ example: Opnel5aKBz
+ client_id:
+ description: 'The client hashed id'
+ type: string
+ example: Opnel5aKBz
+ status_id:
+ description: 'The quote status variable'
+ type: string
+ example: '4'
+ frequency_id:
+ description: 'The recurring quote frequency'
+ type: number
+ example: '4'
+ remaining_cycles:
+ description: 'The number of quotes left to be generated'
+ type: number
+ example: '4'
+ number:
+ description: 'The recurringquote number - is a unique alpha numeric number per quote per company'
+ type: string
+ example: INV_101
+ po_number:
+ description: 'The purchase order associated with this recurring quote'
+ type: string
+ example: PO-1234
+ terms:
+ description: 'The quote terms'
+ type: string
+ example: 'These are quote terms'
+ public_notes:
+ description: 'The public notes of the quote'
+ type: string
+ example: 'These are some public notes'
+ private_notes:
+ description: 'The private notes of the quote'
+ type: string
+ example: 'These are some private notes'
+ footer:
+ description: 'The quote footer notes'
+ type: string
+ example: ''
+ custom_value1:
+ description: 'A custom field value'
+ type: string
+ example: '2022-10-01'
+ custom_value2:
+ description: 'A custom field value'
+ type: string
+ example: 'Something custom'
+ custom_value3:
+ description: 'A custom field value'
+ type: string
+ example: ''
+ custom_value4:
+ description: 'A custom field value'
+ type: string
+ example: ''
+ tax_name1:
+ description: 'The tax name'
+ type: string
+ example: ''
+ tax_name2:
+ description: 'The tax name'
+ type: string
+ example: ''
+ tax_rate1:
+ description: 'The tax rate'
+ type: number
+ format: float
+ example: '10.00'
+ tax_rate2:
+ description: 'The tax rate'
+ type: number
+ format: float
+ example: '10.00'
+ tax_name3:
+ description: 'The tax name'
+ type: string
+ example: ''
+ tax_rate3:
+ description: 'The tax rate'
+ type: number
+ format: float
+ example: '10.00'
+ total_taxes:
+ description: 'The total taxes for the quote'
+ type: number
+ format: float
+ example: '10.00'
+ line_items:
+ description: 'An array of objects which define the line items of the quote'
+ type: object
+ example: ''
+ amount:
+ description: 'The quote amount'
+ type: number
+ format: float
+ example: '10.00'
+ balance:
+ description: 'The quote balance'
+ type: number
+ format: float
+ example: '10.00'
+ paid_to_date:
+ description: 'The amount paid on the quote to date'
+ type: number
+ format: float
+ example: '10.00'
+ discount:
+ description: 'The quote discount, can be an amount or a percentage'
+ type: number
+ format: float
+ example: '10.00'
+ partial:
+ description: 'The deposit/partial amount'
+ type: number
+ format: float
+ example: '10.00'
+ is_amount_discount:
+ description: 'Flag determining if the discount is an amount or a percentage'
+ type: boolean
+ example: true
+ is_deleted:
+ description: 'Defines if the quote has been deleted'
+ type: boolean
+ example: true
+ uses_inclusive_taxes:
+ description: 'Defines the type of taxes used as either inclusive or exclusive'
+ type: boolean
+ example: true
+ date:
+ description: 'The quote Date'
+ type: string
+ format: date
+ example: '1994-07-30'
+ last_sent_date:
+ description: 'The last date the quote was sent out'
+ type: string
+ format: date
+ example: '1994-07-30'
+ next_send_date:
+ description: 'The Next date for a reminder to be sent'
+ type: string
+ format: date
+ example: '1994-07-30'
+ partial_due_date:
+ description: 'The due date for the deposit/partial amount'
+ type: string
+ format: date
+ example: '1994-07-30'
+ due_date:
+ description: 'The due date of the quote'
+ type: string
+ format: date
+ example: '1994-07-30'
+ settings:
+ $ref: '#/components/schemas/CompanySettings'
+ last_viewed:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ updated_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ archived_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ custom_surcharge1:
+ description: 'First Custom Surcharge'
+ type: number
+ format: float
+ example: '10.00'
+ custom_surcharge2:
+ description: 'Second Custom Surcharge'
+ type: number
+ format: float
+ example: '10.00'
+ custom_surcharge3:
+ description: 'Third Custom Surcharge'
+ type: number
+ format: float
+ example: '10.00'
+ custom_surcharge4:
+ description: 'Fourth Custom Surcharge'
+ type: number
+ format: float
+ example: '10.00'
+ custom_surcharge_tax1:
+ description: 'Toggles charging taxes on custom surcharge amounts'
+ type: boolean
+ example: true
+ custom_surcharge_tax2:
+ description: 'Toggles charging taxes on custom surcharge amounts'
+ type: boolean
+ example: true
+ custom_surcharge_tax3:
+ description: 'Toggles charging taxes on custom surcharge amounts'
+ type: boolean
+ example: true
+ custom_surcharge_tax4:
+ description: 'Toggles charging taxes on custom surcharge amounts'
+ type: boolean
+ example: true
+ type: object
+ Client:
+ properties:
+ id:
+ description: 'The unique identifier of the client'
+ type: string
+ example: Opnel5aKBz
+ readOnly: true
+ contacts:
+ type: array
+ items:
+ $ref: '#/components/schemas/ClientContact'
+ user_id:
+ description: 'The unique identifier of the user who created the client'
+ type: string
+ example: Ua6Rw4pVbS
+ readOnly: true
+ assigned_user_id:
+ description: 'The unique identifier of the user who has been assigned the client'
+ type: string
+ example: Ua6Rw4pVbS
+ name:
+ description: 'The name of the client company or organization'
+ type: string
+ example: "Jim's Housekeeping"
+ website:
+ description: 'The website URL of the client company or organization'
+ type: string
+ example: 'https://www.jims-housekeeping.com'
+ private_notes:
+ description: 'Notes that are only visible to the user who created the client'
+ type: string
+ example: 'Client prefers email communication over phone calls'
+ client_hash:
+ description: 'A unique hash value for the client'
+ type: string
+ example: asdfkjhk342hjhbfdvmnfb1
+ readOnly: true
+ industry_id:
+ description: 'The unique identifier of the industry the client operates in'
+ type: number
+ example: '5'
+ size_id:
+ description: 'The unique identifier for the size category of the client company or organization'
+ type: number
+ example: '2'
+ address1:
+ description: "First line of the client's address"
+ type: string
+ example: '123 Main St'
+ address2:
+ description: "Second line of the client's address, if needed"
+ type: string
+ example: 'Apt 4B'
+ city:
+ description: 'The city the client is located in'
+ type: string
+ example: 'Beverly Hills'
+ state:
+ description: 'The state, province, or locality the client is located in'
+ type: string
+ example: 'California'
+ postal_code:
+ description: 'The postal code or ZIP code of the client'
+ type: string
+ example: '90210'
+ phone:
+ description: "The client's phone number"
+ type: string
+ example: '555-3434-3434'
+ country_id:
+ description: "The unique identifier of the client's country"
+ type: number
+ format: integer
+ example: '1'
+ custom_value1:
+ description: 'A custom field for storing additional information'
+ type: string
+ example: 'Preferred contact: Email'
+ custom_value2:
+ description: 'A custom field for storing additional information'
+ type: string
+ example: 'Account manager: John Doe'
+ custom_value3:
+ description: 'A custom field for storing additional information'
+ type: string
+ example: 'VIP client: Yes'
+ custom_value4:
+ description: 'A custom field for storing additional information'
+ type: string
+ example: 'Annual contract value: $50,000'
+ vat_number:
+ description: "The client's VAT (Value Added Tax) number, if applicable"
+ type: string
+ example: 'VAT123456'
+ id_number:
+ description: 'A unique identification number for the client, such as a tax ID or business registration number'
+ type: string
+ number:
+ description: 'A system-assigned unique number for the client, typically used for invoicing purposes'
+ type: string
+ example: 'CL-0001'
+ shipping_address1:
+ description: "First line of the client's shipping address"
+ type: string
+ example: '5 Wallaby Way'
+ shipping_address2:
+ description: "Second line of the client's shipping address, if needed"
+ type: string
+ example: 'Suite 5'
+ shipping_city:
+ description: "The city of the client's shipping address"
+ type: string
+ example: 'Perth'
+ shipping_state:
+ description: "The state, province, or locality of the client's shipping address"
+ type: string
+ example: 'Western Australia'
+ shipping_postal_code:
+ description: "The postal code or ZIP code of the client's shipping address"
+ type: string
+ example: '6110'
+ shipping_country_id:
+ description: "The unique identifier of the country for the client's shipping address"
+ type: number
+ format: integer
+ example: '4'
+ is_deleted:
+ description: 'A boolean value indicating whether the client has been deleted or not'
+ type: boolean
+ example: false
+ readOnly: true
+ balance:
+ description: 'The outstanding balance the client owes'
+ type: number
+ format: float
+ example: '500.00'
+ readOnly: true
+ paid_to_date:
+ description: 'The total amount the client has paid to date'
+ type: number
+ format: float
+ example: '2000.00'
+ readOnly: true
+ credit_balance:
+ description: 'The available credit balance for the client to use on future purchases'
+ type: number
+ format: float
+ example: '100.00'
+ readOnly: true
+ last_login:
+ description: "The timestamp of the client's last login"
+ type: number
+ format: integer
+ example: '1628686031'
+ readOnly: true
+ created_at:
+ description: 'The timestamp when the client was created'
+ type: number
+ format: integer
+ example: '1617629031'
+ readOnly: true
+ updated_at:
+ description: 'The timestamp when the client was last updated'
+ type: number
+ format: integer
+ example: '1628445631'
+ readOnly: true
+ group_settings_id:
+ description: 'The group settings assigned to the client'
+ type: string
+ example: Opnel5aKBz
+ routing_id:
+ description: 'The routing address id for e-invoicing for this client'
+ type: string
+ example: Opnel5aKBz3489-dfkiu-2239-sdsd
+ is_tax_exempt:
+ description: 'Flag which defines if the client is exempt from taxes'
+ type: boolean
+ example: false
+ has_valid_vat_number:
+ description: 'Flag which defines if the client has a valid VAT number'
+ type: boolean
+ example: false
+ readOnly: true
+ payment_balance:
+ description: 'Defines the payment balance the client has on file (pre payments / over payments / unapplied amounts)'
+ type: number
+ example: 100
+ readOnly: true
+ settings:
+ $ref: '#/components/schemas/ClientSettings'
+ type: object
+ PaymentTerm:
+ properties:
+ num_days:
+ description: 'The payment term length in days'
+ type: integer
+ example: '1'
+ name:
+ description: 'The payment term length in string format'
+ type: string
+ example: 'NET 1'
+ created_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '134341234234'
+ updated_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '134341234234'
+ archived_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '134341234234'
+ type: object
+ Product:
+ type: object
+ properties:
+ id:
+ type: string
+ description: 'The hashed product ID.'
+ example: eP01N
+ readOnly: true
+ user_id:
+ type: string
+ description: 'The hashed ID of the user that created this product.'
+ example: n30m4
+ readOnly: true
+ assigned_user_id:
+ type: string
+ description: 'The hashed ID of the user assigned to this product.'
+ example: pR0j3
+ project_id:
+ type: string
+ description: 'The hashed ID of the project that this product is associated with.'
+ example: pR0j3
+ vendor_id:
+ type: string
+ description: 'The hashed ID of the vendor that this product is associated with.'
+ example: pR0j3
+ custom_value1:
+ type: string
+ description: 'Custom value field 1.'
+ example: 'Custom value 1'
+ custom_value2:
+ type: string
+ description: 'Custom value field 2.'
+ example: 'Custom value 2'
+ custom_value3:
+ type: string
+ description: 'Custom value field 3.'
+ example: 'Custom value 3'
+ custom_value4:
+ type: string
+ description: 'Custom value field 4.'
+ example: 'Custom value 4'
+ product_key:
+ type: string
+ description: 'The product key.'
+ example: '1234'
+ notes:
+ type: string
+ description: 'Notes about the product.'
+ example: 'These are some notes about the product.'
+ cost:
+ type: number
+ format: double
+ description: 'The cost of the product. (Your purchase price for this product)'
+ example: 10.0
+ price:
+ type: number
+ format: double
+ description: 'The price of the product that you are charging.'
+ example: 20.0
+ quantity:
+ type: number
+ format: double
+ description: 'The quantity of the product. (used as a default)'
+ example: 5.0
+ tax_name1:
+ type: string
+ description: 'The name of tax 1.'
+ example: 'Tax 1'
+ tax_rate1:
+ type: number
+ format: double
+ description: 'The rate of tax 1.'
+ example: 10.0
+ tax_name2:
+ type: string
+ description: 'The name of tax 2.'
+ example: 'Tax 2'
+ tax_rate2:
+ type: number
+ format: double
+ description: 'The rate of tax 2.'
+ example: 5.0
+ tax_name3:
+ type: string
+ description: 'The name of tax 3.'
+ example: 'Tax 3'
+ tax_rate3:
+ type: number
+ format: double
+ description: 'The rate of tax 3.'
+ example: 0.0
+ archived_at:
+ type: integer
+ format: timestamp
+ description: 'The timestamp when the product was archived.'
+ example: '2022-03-18T15:00:00Z'
+ readOnly: true
+ created_at:
+ type: integer
+ format: timestamp
+ description: 'The timestamp when the product was created.'
+ example: '2022-03-18T15:00:00Z'
+ readOnly: true
+ updated_at:
+ description: Timestamp
+ type: integer
+ format: timestamp
+ example: '2022-03-18T12:34:56.789Z'
+ readOnly: true
+ is_deleted:
+ type: boolean
+ description: 'Boolean flag determining if the product has been deleted'
+ example: false
+ readOnly: true
+ in_stock_quantity:
+ type: integer
+ format: int32
+ description: The quantity of the product that is currently in stock
+ default: 0
+ stock_notification:
+ type: boolean
+ description: Indicates whether stock notifications are enabled for this product
+ default: true
+ stock_notification_threshold:
+ type: integer
+ format: int32
+ description: The minimum quantity threshold for which stock notifications will be triggered
+ default: 0
+ max_quantity:
+ type: integer
+ format: int32
+ description: The maximum quantity that can be ordered for this product
+ product_image:
+ type: string
+ description: The URL of the product image
+ format: uri-reference
+ tax_id:
+ type: string
+ default: '1'
+ description: |
+ The tax category id for this product.'
+
+ The following constants are available (default = '1')
+
+ ```
+ PRODUCT_TYPE_PHYSICAL = '1'
+ PRODUCT_TYPE_SERVICE = '2'
+ PRODUCT_TYPE_DIGITAL = '3'
+ PRODUCT_TYPE_SHIPPING = '4'
+ PRODUCT_TYPE_EXEMPT = '5'
+ PRODUCT_TYPE_REDUCED_TAX = '6'
+ PRODUCT_TYPE_OVERRIDE_TAX = '7'
+ PRODUCT_TYPE_ZERO_RATED = '8'
+ PRODUCT_TYPE_REVERSE_TAX = '9'
+ ```
+ example: '1'
+
+ Meta:
+ properties:
+ pagination:
+ $ref: '#/components/schemas/Pagination'
+ Pagination:
+ type: object
+ properties:
+ total:
+ type: integer
+ description: 'The total number of items'
+ example: 1
+ readOnly: true
+ count:
+ type: integer
+ description: 'The number of items per page'
+ example: 1
+ readOnly: true
+ per_page:
+ type: integer
+ description: 'The number of items per page'
+ example: 1
+ readOnly: true
+ current_page:
+ type: integer
+ description: 'The current page number'
+ example: 1
+ readOnly: true
+ total_pages:
+ type: integer
+ description: 'The total number of pages'
+ example: 1
+ readOnly: true
+ links:
+ type: object
+ description: 'The pagination links'
+ readOnly: true
+ ClientContactRequest:
+ properties:
+ id:
+ description: 'The hashed if of the contact'
+ type: string
+ example: Opnel5aKBz
+ readOnly: true
+ first_name:
+ description: 'The first name of the contact'
+ type: string
+ example: John
+ last_name:
+ description: 'The last name of the contact'
+ type: string
+ example: Doe
+ phone:
+ description: 'The phone number of the contact'
+ type: string
+ example: 555-152-4524
+ custom_value1:
+ description: 'A Custom field value'
+ type: string
+ example: ''
+ custom_value2:
+ description: 'A Custom field value'
+ type: string
+ example: ''
+ custom_value3:
+ description: 'A Custom field value'
+ type: string
+ example: ''
+ custom_value4:
+ description: 'A Custom field value'
+ type: string
+ example: ''
+ email:
+ description: 'The email of the contact'
+ type: string
+ example: ''
+ password:
+ description: 'The hashed password of the contact'
+ type: string
+ example: '*****'
+ send_email:
+ description: 'Boolean value determines is this contact should receive emails'
+ type: boolean
+ example: true
+ type: object
+ Design:
+ properties:
+ id:
+ description: 'The design hashed id'
+ type: string
+ example: AS3df3A
+ name:
+ description: 'The design name'
+ type: string
+ example: Beauty
+ design:
+ description: 'The design HTML'
+ type: string
+ example: ''
+ is_custom:
+ description: 'Flag to determine if the design is a custom user design'
+ type: boolean
+ example: true
+ is_active:
+ description: 'Flag to determine if the design is available for use'
+ type: boolean
+ example: true
+ is_deleted:
+ description: 'Flag to determine if the design is deleted'
+ type: boolean
+ example: true
+ created_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '134341234234'
+ updated_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '134341234234'
+ deleted_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '134341234234'
+ type: object
+ Vendor:
+ properties:
+ id:
+ description: 'The hashed id of the vendor. This is a unique identifier for the vendor.'
+ type: string
+ example: Opnel5aKBz
+ readOnly: true
+ user_id:
+ description: 'The hashed id of the user who created the vendor. This is a unique identifier for the user.'
+ type: string
+ example: Opnel5aKBz
+ assigned_user_id:
+ description: 'The hashed id of the assigned user to this vendor. This is a unique identifier for the user.'
+ type: string
+ example: Opnel5aKBz
+ contacts:
+ type: array
+ items:
+ $ref: '#/components/schemas/VendorContact'
+ description: 'An array of contacts associated with the vendor.'
+ name:
+ description: 'The name of the vendor.'
+ type: string
+ example: 'Harry cafe de wheels'
+ classification:
+ description: 'The classification of the vendor.'
+ type: string
+ example: 'individual'
+ website:
+ description: 'The website of the vendor.'
+ type: string
+ example: www.harry.com
+ private_notes:
+ description: 'The private notes of the vendor. These notes are only visible to users with appropriate permissions.'
+ type: string
+ example: 'Shhh, do not tell the vendor'
+ industry_id:
+ description: 'The industry id of the vendor. This is a unique identifier for the industry.'
+ type: string
+ example: '1'
+ size_id:
+ description: 'The size id of the vendor. This is a unique identifier for the size of the vendor.'
+ type: string
+ example: ''
+ address1:
+ description: 'The first line of the vendor''s address.'
+ type: string
+ example: ''
+ address2:
+ description: 'The second line of the vendor''s address.'
+ type: string
+ example: ''
+ city:
+ description: 'The city of the vendor''s address.'
+ type: string
+ example: ''
+ state:
+ description: 'The state of the vendor''s address.'
+ type: string
+ example: ''
+ postal_code:
+ description: 'The postal code of the vendor''s address.'
+ type: string
+ example: ''
+ phone:
+ description: 'The phone number of the vendor.'
+ type: string
+ example: 555-3434-3434
+ country_id:
+ description: 'The country id of the vendor. This is a unique identifier for the country.'
+ type: string
+ example: ''
+ currency_id:
+ description: 'The currency id of the vendor. This is a unique identifier for the currency.'
+ type: string
+ example: '4'
+ custom_value1:
+ description: 'The value of the first custom field for the vendor.'
+ type: string
+ example: ''
+ custom_value2:
+ description: 'The value of the second custom field for the vendor.'
+ type: string
+ example: ''
+ custom_value3:
+ description: 'The value of the third custom field for the vendor.'
+ type: string
+ example: ''
+ custom_value4:
+ description: 'The value of the fourth custom field for the vendor.'
+ type: string
+ example: ''
+ vat_number:
+ description: 'The VAT number of the vendor.'
+ type: string
+ example: ''
+ id_number:
+ description: 'The ID number of the vendor.'
+ type: string
+ example: ''
+ number:
+ description: 'The number of the vendor'
+ type: string
+ example: '11234'
+ is_deleted:
+ description: 'Boolean flag determining if the vendor has been deleted'
+ type: boolean
+ example: true
+ language_id:
+ description: 'The language id of the vendor. This is a unique identifier for the language.'
+ type: string
+ example: '1'
+ vendor_hash:
+ description: 'The vendor hash of the vendor. This is a unique identifier for the vendor.'
+ type: string
+ example: 'aaa-sss-www'
+ readOnly: true
+ transaction_name:
+ description: 'The transaction name of the vendor.'
+ type: string
+ example: 'aaa-sss-www'
+ last_login:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '134341234234'
+ readOnly: true
+ created_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '134341234234'
+ readOnly: true
+ updated_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '134341234234'
+ readOnly: true
+ display_name:
+ description: 'The display name of the vendor.'
+ type: string
+ example: 'Bob the vendor'
+ readOnly: true
+ type: object
+ BTRules:
+ properties:
+ data_key:
+ description: 'The key to search'
+ type: string
+ example: 'description,amount'
+ operator:
+ description: 'The operator flag of the search'
+ type: string
+ example: '>'
+ value:
+ description: 'The value to search for'
+ type: string
+ example: bob
type: object
ClientRequest:
required:
@@ -19879,133 +19555,188 @@ components:
settings:
$ref: '#/components/schemas/ClientSettings'
type: object
- Vendor:
+ BankTransaction:
properties:
id:
- description: 'The hashed id of the vendor. This is a unique identifier for the vendor.'
+ description: 'The bank integration hashed id'
+ type: string
+ example: AS3df3A
+ user_id:
+ description: 'The user hashed id'
+ type: string
+ example: AS3df3A
+ transaction_id:
+ description: 'The id of the transaction rule'
+ type: integer
+ example: 343434
+ amount:
+ description: 'The transaction amount'
+ type: number
+ example: 10
+ currency_id:
+ description: 'The currency ID of the currency'
+ type: string
+ example: '1'
+ account_type:
+ description: 'The account type'
+ type: string
+ example: creditCard
+ description:
+ description: 'The description of the transaction'
+ type: string
+ example: 'Potato purchases for kevin'
+ category_id:
+ description: 'The category id'
+ type: integer
+ example: 1
+ category_type:
+ description: 'The category description'
+ type: string
+ example: Expenses
+ base_type:
+ description: 'Either CREDIT or DEBIT'
+ type: string
+ example: CREDIT
+ date:
+ description: 'The date of the transaction'
+ type: string
+ example: '2022-09-01'
+ bank_account_id:
+ description: 'The ID number of the bank account'
+ type: integer
+ example: '1'
+ type: object
+
+ FeesAndLimits:
+ properties:
+ min_limit:
+ description: 'The minimum amount accepted for this gateway'
+ type: string
+ example: '2'
+ max_limit:
+ description: 'The maximum amount accepted for this gateway'
+ type: string
+ example: '2'
+ fee_amount:
+ description: 'The gateway fee amount'
+ type: number
+ format: float
+ example: '2.0'
+ fee_percent:
+ description: 'The gateway fee percentage'
+ type: number
+ format: float
+ example: '2.0'
+ fee_tax_name1:
+ description: 'Fee tax name'
+ type: string
+ example: GST
+ fee_tax_name2:
+ description: 'Fee tax name'
+ type: string
+ example: VAT
+ fee_tax_name3:
+ description: 'Fee tax name'
+ type: string
+ example: 'CA Sales Tax'
+ fee_tax_rate1:
+ description: 'The tax rate'
+ type: number
+ format: float
+ example: '10.0'
+ fee_tax_rate2:
+ description: 'The tax rate'
+ type: number
+ format: float
+ example: '17.5'
+ fee_tax_rate3:
+ description: 'The tax rate'
+ type: number
+ format: float
+ example: '25.0'
+ fee_cap:
+ description: 'If set the fee amount will be no higher than this amount'
+ type: number
+ format: float
+ example: '2.0'
+ adjust_fee_percent:
+ description: 'Adjusts the fee to match the exact gateway fee.'
+ type: boolean
+ example: true
+ type: object
+ VendorContact:
+ properties:
+ id:
+ description: 'The hashed id of the vendor contact'
type: string
example: Opnel5aKBz
readOnly: true
user_id:
- description: 'The hashed id of the user who created the vendor. This is a unique identifier for the user.'
+ description: 'The hashed id of the user id'
type: string
example: Opnel5aKBz
- assigned_user_id:
- description: 'The hashed id of the assigned user to this vendor. This is a unique identifier for the user.'
+ readOnly: true
+ vendor_id:
+ description: 'The hashed id of the vendor'
type: string
example: Opnel5aKBz
- contacts:
- type: array
- items:
- $ref: '#/components/schemas/VendorContact'
- description: 'An array of contacts associated with the vendor.'
- name:
- description: 'The name of the vendor.'
+ readOnly: true
+ first_name:
+ description: 'The first name of the contact'
type: string
- example: 'Harry cafe de wheels'
- classification:
- description: 'The classification of the vendor.'
+ example: Harry
+ last_name:
+ description: 'The last name of the contact'
type: string
- example: 'individual'
- website:
- description: 'The website of the vendor.'
+ example: Windsor
+ contact_key:
+ description: 'A unique identifier for the contact'
type: string
- example: www.harry.com
- private_notes:
- description: 'The private notes of the vendor. These notes are only visible to users with appropriate permissions.'
+ example: JD0X52bkfZlJRiroCJ0tcSiAjsJTntZ5uqKdiZ0a
+ readOnly: true
+ confirmation_code:
+ description: 'The confirmation code used to authenticate the contacts email address'
type: string
- example: 'Shhh, do not tell the vendor'
- industry_id:
- description: 'The industry id of the vendor. This is a unique identifier for the industry.'
- type: string
- example: '1'
- size_id:
- description: 'The size id of the vendor. This is a unique identifier for the size of the vendor.'
- type: string
- example: ''
- address1:
- description: 'The first line of the vendor''s address.'
- type: string
- example: ''
- address2:
- description: 'The second line of the vendor''s address.'
- type: string
- example: ''
- city:
- description: 'The city of the vendor''s address.'
- type: string
- example: ''
- state:
- description: 'The state of the vendor''s address.'
- type: string
- example: ''
- postal_code:
- description: 'The postal code of the vendor''s address.'
- type: string
- example: ''
+ example: 333-sdjkh34gbasd
+ readOnly: true
phone:
- description: 'The phone number of the vendor.'
+ description: 'The contacts phone number'
type: string
- example: 555-3434-3434
- country_id:
- description: 'The country id of the vendor. This is a unique identifier for the country.'
- type: string
- example: ''
- currency_id:
- description: 'The currency id of the vendor. This is a unique identifier for the currency.'
- type: string
- example: '4'
+ example: 555-123-1234
custom_value1:
- description: 'The value of the first custom field for the vendor.'
+ description: 'A custom value'
type: string
- example: ''
+ example: '2022-10-10'
custom_value2:
- description: 'The value of the second custom field for the vendor.'
+ description: 'A custom value'
type: string
- example: ''
+ example: $1000
custom_value3:
- description: 'The value of the third custom field for the vendor.'
+ description: 'A custom value'
type: string
example: ''
custom_value4:
- description: 'The value of the fourth custom field for the vendor.'
+ description: 'A custom value'
type: string
example: ''
- vat_number:
- description: 'The VAT number of the vendor.'
+ email:
+ description: 'The contact email address'
type: string
- example: ''
- id_number:
- description: 'The ID number of the vendor.'
- type: string
- example: ''
- number:
- description: 'The number of the vendor'
- type: string
- example: '11234'
- is_deleted:
- description: 'Boolean flag determining if the vendor has been deleted'
- type: boolean
- example: true
- language_id:
- description: 'The language id of the vendor. This is a unique identifier for the language.'
- type: string
- example: '1'
- vendor_hash:
- description: 'The vendor hash of the vendor. This is a unique identifier for the vendor.'
- type: string
- example: 'aaa-sss-www'
- readOnly: true
- transaction_name:
- description: 'The transaction name of the vendor.'
- type: string
- example: 'aaa-sss-www'
- last_login:
- description: Timestamp
+ example: harry@windsor.com
+ email_verified_at:
+ description: 'The date which the contact confirmed their email'
type: number
format: integer
example: '134341234234'
readOnly: true
+ password:
+ description: 'The hashed password of the contact'
+ type: string
+ example: '*****'
+ is_primary:
+ description: 'Boolean flag determining if the contact is the primary contact for the vendor'
+ type: boolean
+ example: true
created_at:
description: Timestamp
type: number
@@ -20018,12 +19749,1022 @@ components:
format: integer
example: '134341234234'
readOnly: true
- display_name:
- description: 'The display name of the vendor.'
- type: string
- example: 'Bob the vendor'
+ deleted_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '134341234234'
readOnly: true
type: object
+ InvoiceInvitationRequest:
+ required:
+ - client_contact_id
+ properties:
+ id:
+ description: 'The entity invitation hashed id'
+ type: string
+ example: Opnel5aKBz
+ readOnly: true
+ client_contact_id:
+ description: 'The client contact hashed id'
+ type: string
+ example: Opnel5aKBz
+ key:
+ description: 'The invitation key'
+ type: string
+ example: Opnel5aKBz4343343566236gvbb
+ readOnly: true
+ link:
+ description: 'The invitation link'
+ type: string
+ example: 'https://www.example.com/invitations/Opnel5aKBz4343343566236gvbb'
+ readOnly: true
+ sent_date:
+ description: 'The invitation sent date'
+ type: string
+ format: date-time
+ readOnly: true
+ viewed_date:
+ description: 'The invitation viewed date'
+ type: string
+ format: date-time
+ readOnly: true
+ opened_date:
+ description: 'The invitation opened date'
+ type: string
+ format: date-time
+ readOnly: true
+ updated_at:
+ description: 'Timestamp'
+ type: number
+ format: integer
+ example: '1434342123'
+ readOnly: true
+ archived_at:
+ description: 'Timestamp'
+ type: number
+ format: integer
+ example: '1434342123'
+ readOnly: true
+ email_error:
+ description: 'The email error'
+ type: string
+ example: 'The email error'
+ readOnly: true
+ email_status:
+ description: 'The email status'
+ type: string
+ readOnly: true
+
+ Paymentable:
+ properties:
+ id:
+ description: 'The paymentable hashed id'
+ type: string
+ example: AS3df3A
+ invoice_id:
+ description: 'The invoice hashed id'
+ type: string
+ example: AS3df3A
+ credit_id:
+ description: 'The credit hashed id'
+ type: string
+ example: AS3df3A
+ refunded:
+ description: 'The amount that has been refunded for this payment'
+ type: number
+ format: float
+ example: '10.00'
+ amount:
+ description: 'The amount that has been applied to the payment'
+ type: number
+ format: float
+ example: '10.00'
+ updated_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ created_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ type: object
+ Company:
+ properties:
+ id:
+ description: "The unique hashed identifier for the company"
+ type: string
+ example: WJxbojagwO
+ size_id:
+ description: "The unique identifier representing the company's size category"
+ type: string
+ example: '2'
+ industry_id:
+ description: "The unique identifier representing the company's industry category"
+ type: string
+ example: '5'
+ slack_webhook_url:
+ description: "The URL for the company's Slack webhook notifications"
+ type: string
+ example: 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX'
+ google_analytics_key:
+ description: "The company's Google Analytics tracking ID"
+ type: string
+ example: 'UA-123456789-1'
+ portal_mode:
+ description: "The mode determining how client-facing URLs are structured (e.g., subdomain, domain, or iframe)"
+ type: string
+ example: subdomain
+ subdomain:
+ description: "The subdomain prefix for the company's domain (e.g., 'acme' in acme.domain.com)"
+ type: string
+ example: acme
+ portal_domain:
+ description: "The fully qualified domain used for client-facing URLs"
+ type: string
+ example: 'https://subdomain.invoicing.co'
+ enabled_tax_rates:
+ description: "The number of tax rates used per entity"
+ type: integer
+ example: '2'
+ fill_products:
+ description: "A flag determining whether to auto-fill product descriptions based on the product key"
+ type: boolean
+ example: true
+ convert_products:
+ description: "A flag determining whether to convert products between different types or units"
+ type: boolean
+ example: true
+ update_products:
+ description: "A flag determining whether to update product descriptions when the description changes"
+ type: boolean
+ example: true
+ show_product_details:
+ description: "A flag determining whether to display product details in the user interface"
+ type: boolean
+ example: true
+ show_product_cost:
+ description: "A flag determining whether to display product cost is shown in the user interface"
+ type: boolean
+ example: true
+ custom_fields:
+ description: "A mapping of custom fields for various objects within the company"
+ type: object
+ enable_product_cost:
+ description: "A flag determining whether to show or hide the product cost field in the user interface"
+ type: boolean
+ example: true
+ enable_product_quantity:
+ description: "A flag determining whether to show or hide the product quantity field in the user interface"
+ type: boolean
+ example: true
+ default_quantity:
+ description: "A flag determining whether to use a default quantity for products"
+ type: boolean
+ example: true
+ custom_surcharge_taxes1:
+ description: "A flag determining whether to apply taxes on custom surcharge amounts for the first custom surcharge field"
+ type: boolean
+ example: true
+ custom_surcharge_taxes2:
+ description: "A flag determining whether to apply taxes on custom surcharge amounts for the second custom surcharge field"
+ type: boolean
+ example: true
+ custom_surcharge_taxes3:
+ description: "A flag determining whether to apply taxes on custom surcharge amounts for the third custom surcharge field"
+ type: boolean
+ example: true
+ custom_surcharge_taxes4:
+ description: "A flag determining whether to apply taxes on custom surcharge amounts for the fourth custom"
+ logo:
+ description: "The company logo file in binary format"
+ type: string
+ format: binary
+ example: logo.png
+ company_key:
+ description: "The static company key hash used to identify the Company"
+ readOnly: true
+ type: string
+ example: "Vnb14bRlwiFjc5ckte6cfbygTRkn5IMQ"
+ client_can_register:
+ description: "A flag determining whether clients can register for the client portal"
+ type: boolean
+ example: true
+ enabled_modules:
+ type: integer
+ description: |
+ Bitmask representation of the modules that are enabled in the application
+
+ ```
+ self::ENTITY_RECURRING_INVOICE => 1,
+ self::ENTITY_CREDIT => 2,
+ self::ENTITY_QUOTE => 4,
+ self::ENTITY_TASK => 8,
+ self::ENTITY_EXPENSE => 16,
+ self::ENTITY_PROJECT => 32,
+ self::ENTITY_VENDOR => 64,
+ self::ENTITY_TICKET => 128,
+ self::ENTITY_PROPOSAL => 256,
+ self::ENTITY_RECURRING_EXPENSE => 512,
+ self::ENTITY_RECURRING_TASK => 1024,
+ self::ENTITY_RECURRING_QUOTE => 2048,
+ ```
+
+ The default per_page value is 20.
+
+ example: 2048
+ db:
+ readOnly: true
+ type: string
+ example: 'db-ninja-01'
+ first_day_of_week:
+ description: "The first day of the week for the company"
+ type: string
+ example: '1'
+ first_month_of_year:
+ description: "The first month for the company financial year"
+ type: string
+ example: '1'
+ enabled_item_tax_rates:
+ description: "The number of tax rates used per item"
+ type: integer
+ example: 2
+ is_large:
+ description: "A flag determining whether the company is considered large"
+ type: boolean
+ example: true
+ default_auto_bill:
+ type: string
+ example: 'always'
+ description: |
+ A flag determining whether to auto-bill clients by default
+
+ values:
+
+ - always - Always auto bill
+ - disabled - Never auto bill
+ - optin - Allow the client to select their auto bill status with the default being disabled
+ - optout -Allow the client to select their auto bill status with the default being enabled
+ mark_expenses_invoiceable:
+ description: "A flag determining whether to mark expenses as invoiceable by default"
+ type: boolean
+ example: true
+ mark_expenses_paid:
+ description: "A flag determining whether to mark expenses as paid by default"
+ type: boolean
+ example: true
+ invoice_expense_documents:
+ description: "A flag determining whether to include expense documents on invoices by default"
+ type: boolean
+ example: true
+ auto_start_tasks:
+ description: "A flag determining whether to auto-start tasks by default"
+ type: boolean
+ example: true
+ invoice_task_timelog:
+ description: "A flag determining whether to include task time logs on invoices by default"
+ type: boolean
+ example: true
+ invoice_task_documents:
+ description: "A flag determining whether to include task documents on invoices by default"
+ type: boolean
+ example: true
+ show_tasks_table:
+ description: "A flag determining whether to show the tasks table on invoices by default"
+ type: boolean
+ example: true
+ is_disabled:
+ description: "A flag determining whether the company is disabled"
+ type: boolean
+ example: true
+ default_task_is_date_based:
+ description: "A flag determining whether to default tasks to be date-based"
+ type: boolean
+ example: true
+ enable_product_discount:
+ description: "A flag determining whether to show or hide the product discount field in the user interface"
+ type: boolean
+ example: true
+ calculate_expense_tax_by_amount:
+ description: "A flag determining whether to calculate expense taxes by amount"
+ type: boolean
+ example: true
+ expense_inclusive_taxes:
+ description: "A flag determining whether to include taxes in the expense amount"
+ type: boolean
+ example: true
+ session_timeout:
+ description: "The session timeout for the company"
+ type: integer
+ example: 60
+ oauth_password_required:
+ description: "A flag determining whether to require a password for `dangerous` actions when using OAuth"
+ type: boolean
+ example: true
+ invoice_task_datelog:
+ description: "A flag determining whether to include task date logs on invoices by default"
+ type: boolean
+ example: true
+ default_password_timeout:
+ description: "The default password timeout for the company"
+ type: integer
+ example: 60
+ show_task_end_date:
+ description: "A flag determining whether to show the task end date on invoices by default"
+ type: boolean
+ example: true
+ markdown_enabled:
+ description: "A flag determining whether markdown is enabled for the company"
+ type: boolean
+ example: true
+ report_include_drafts:
+ description: "A flag determining whether to include draft invoices in reports"
+ type: boolean
+ example: true
+ client_registration_fields:
+ description: "The client registration fields for the company"
+ type: object
+ stop_on_unpaid_recurring:
+ description: "A flag determining whether to stop recurring invoices when they are unpaid"
+ type: boolean
+ example: true
+ use_quote_terms_on_conversion:
+ description: "A flag determining whether to use quote terms on conversion to an invoice"
+ type: boolean
+ example: true
+ enable_applying_payments:
+ description: "A flag determining whether to enable applying payments to invoices"
+ type: boolean
+ example: true
+ track_inventory:
+ description: "A flag determining whether to track inventory for the company"
+ type: boolean
+ example: true
+ inventory_notification_threshold:
+ description: "The inventory notification threshold for the company"
+ type: integer
+ example: 60
+ stock_notification:
+ description: "A flag determining whether to send stock notifications for the company"
+ type: boolean
+ example: true
+ matomo_url:
+ description: "The Matomo URL for the company"
+ type: string
+ example: 'https://matomo.example.com'
+ matomo_id:
+ description: "The Matomo ID for the company"
+ type: string
+ example: '1'
+ enabled_expense_tax_rates:
+ description: "The number of tax rates used per expense"
+ type: integer
+ example: 2
+ invoice_task_project:
+ description: "A flag determining whether to include the project on invoices by default"
+ type: boolean
+ example: true
+ report_include_deleted:
+ description: "A flag determining whether to include deleted invoices in reports"
+ type: boolean
+ example: true
+ invoice_task_lock:
+ description: "A flag determining whether to lock tasks when invoiced"
+ type: boolean
+ example: true
+ convert_payment_currency:
+ description: "A flag determining whether to convert the payment currency"
+ type: boolean
+ example: true
+ convert_expense_currency:
+ description: "A flag determining whether to convert the expense currency"
+ type: boolean
+ example: true
+ notify_vendor_when_paid:
+ description: "A flag determining whether to notify the vendor when an expense is paid"
+ type: boolean
+ example: true
+ invoice_task_hours:
+ description: "A flag determining whether to include the task hours on invoices by default"
+ type: boolean
+ example: true
+ calculate_taxes:
+ description: "A flag determining whether to calculate taxes for the company"
+ type: boolean
+ example: true
+ tax_data:
+ description: "The tax data for the company"
+ type: object
+ e_invoice_certificate:
+ description: "The e-invoice certificate for the company"
+ type: string
+ example: '-----BEGIN CERTIFICATE-----'
+ e_invoice_certificate_passphrase:
+ description: "The e-invoice certificate passphrase for the company"
+ type: string
+ example: 'secret'
+ origin_tax_data:
+ description: "The origin tax data for the company"
+ type: object
+ invoice_task_project_header:
+ description: "A flag determining whether to include the project header on invoices by default"
+ type: boolean
+ example: true
+ invoice_task_item_description:
+ description: "A flag determining whether to include the item description on invoices by default"
+ type: boolean
+ example: true
+
+ settings:
+ $ref: '#/components/schemas/CompanySettings'
+ type: object
+ ProductRequest:
+ type: object
+ properties:
+ id:
+ type: string
+ description: 'The hashed product ID.'
+ example: eP01N
+ readOnly: true
+ assigned_user_id:
+ type: string
+ description: 'The hashed ID of the user assigned to this product.'
+ example: pR0j3
+
+ project_id:
+ type: string
+ description: 'The hashed ID of the project that this product is associated with.'
+ example: pR0j3
+
+ vendor_id:
+ type: string
+ description: 'The hashed ID of the vendor that this product is associated with.'
+ example: pR0j3
+
+ custom_value1:
+ type: string
+ description: 'Custom value field 1.'
+ example: 'Custom value 1'
+
+ custom_value2:
+ type: string
+ description: 'Custom value field 2.'
+ example: 'Custom value 2'
+
+ custom_value3:
+ type: string
+ description: 'Custom value field 3.'
+ example: 'Custom value 3'
+
+ custom_value4:
+ type: string
+ description: 'Custom value field 4.'
+ example: 'Custom value 4'
+
+ product_key:
+ type: string
+ description: 'The product key.'
+ example: '1234'
+
+ notes:
+ type: string
+ description: 'Notes about the product.'
+ example: 'These are some notes about the product.'
+
+ cost:
+ type: number
+ format: double
+ description: 'The cost of the product.'
+ example: 10.0
+
+ price:
+ type: number
+ format: double
+ description: 'The price of the product.'
+ example: 20.0
+
+ quantity:
+ type: number
+ format: double
+ description: 'The quantity of the product.'
+ example: 5.0
+
+ default: 1
+ tax_name1:
+ type: string
+ description: 'The name of tax 1.'
+ example: 'Tax 1'
+
+ tax_rate1:
+ type: number
+ format: double
+ description: 'The rate of tax 1.'
+ example: 10.0
+
+ tax_name2:
+ type: string
+ description: 'The name of tax 2.'
+ example: 'Tax 2'
+
+ tax_rate2:
+ type: number
+ format: double
+ description: 'The rate of tax 2.'
+ example: 5.0
+
+ tax_name3:
+ type: string
+ description: 'The name of tax 3.'
+ example: 'Tax 3'
+
+ tax_rate3:
+ type: number
+ format: double
+ description: 'The rate of tax 3.'
+ example: 0.0
+
+ in_stock_quantity:
+ type: integer
+ format: int32
+ description: |
+ The quantity of the product that is currently in stock.
+
+ **note** this field is not mutable without passing an extra query parameter which will allow modification of this value.
+
+ The query parameter ?update_in_stock_quantity=true **MUST** be passed if you wish to update this value manually.
+
+ default: 0
+
+ stock_notification:
+ type: boolean
+ description: Indicates whether stock notifications are enabled for this product
+ default: true
+
+ stock_notification_threshold:
+ type: integer
+ format: int32
+ description: The minimum quantity threshold for which stock notifications will be triggered
+ default: 0
+
+ max_quantity:
+ type: integer
+ format: int32
+ description: The maximum quantity that can be ordered for this product
+
+ product_image:
+ type: string
+ description: The URL of the product image
+ format: uri-reference
+
+ tax_id:
+ type: string
+ default: '1'
+
+ description: |
+ The tax category id for this product.'
+
+ The following constants are available (default = '1')
+
+ ```
+ PRODUCT_TYPE_PHYSICAL = '1'
+ PRODUCT_TYPE_SERVICE = '2'
+ PRODUCT_TYPE_DIGITAL = '3'
+ PRODUCT_TYPE_SHIPPING = '4'
+ PRODUCT_TYPE_EXEMPT = '5'
+ PRODUCT_TYPE_REDUCED_TAX = '6'
+ PRODUCT_TYPE_OVERRIDE_TAX = '7'
+ PRODUCT_TYPE_ZERO_RATED = '8'
+ PRODUCT_TYPE_REVERSE_TAX = '9'
+ ```
+ example: '1'
+
+ RecurringInvoice:
+ properties:
+ id:
+ description: 'The hashed id of the recurring invoice'
+ type: string
+ example: Opnel5aKBz
+ user_id:
+ description: 'The user hashed id'
+ type: string
+ example: Opnel5aKBz
+ assigned_user_id:
+ description: 'The assigned user hashed id'
+ type: string
+ example: Opnel5aKBz
+ client_id:
+ description: 'The client hashed id'
+ type: string
+ example: Opnel5aKBz
+ status_id:
+ description: 'The invoice status variable'
+ type: string
+ example: '4'
+ frequency_id:
+ description: 'The recurring invoice frequency'
+ type: number
+ example: '4'
+ remaining_cycles:
+ description: 'The number of invoices left to be generated'
+ type: number
+ example: '4'
+ number:
+ description: 'The recurringinvoice number - is a unique alpha numeric number per invoice per company'
+ type: string
+ example: INV_101
+ po_number:
+ description: 'The purchase order associated with this recurring invoice'
+ type: string
+ example: PO-1234
+ terms:
+ description: 'The invoice terms'
+ type: string
+ example: 'These are invoice terms'
+ public_notes:
+ description: 'The public notes of the invoice'
+ type: string
+ example: 'These are some public notes'
+ private_notes:
+ description: 'The private notes of the invoice'
+ type: string
+ example: 'These are some private notes'
+ footer:
+ description: 'The invoice footer notes'
+ type: string
+ example: ''
+ custom_value1:
+ description: 'A custom field value'
+ type: string
+ example: '2022-10-01'
+ custom_value2:
+ description: 'A custom field value'
+ type: string
+ example: 'Something custom'
+ custom_value3:
+ description: 'A custom field value'
+ type: string
+ example: ''
+ custom_value4:
+ description: 'A custom field value'
+ type: string
+ example: ''
+ tax_name1:
+ description: 'The tax name'
+ type: string
+ example: ''
+ tax_name2:
+ description: 'The tax name'
+ type: string
+ example: ''
+ tax_rate1:
+ description: 'The tax rate'
+ type: number
+ format: float
+ example: '10.00'
+ tax_rate2:
+ description: 'The tax rate'
+ type: number
+ format: float
+ example: '10.00'
+ tax_name3:
+ description: 'The tax name'
+ type: string
+ example: ''
+ tax_rate3:
+ description: 'The tax rate'
+ type: number
+ format: float
+ example: '10.00'
+ total_taxes:
+ description: 'The total taxes for the invoice'
+ type: number
+ format: float
+ example: '10.00'
+ line_items:
+ description: 'An array of objects which define the line items of the invoice'
+ type: object
+ example: ''
+ amount:
+ description: 'The invoice amount'
+ type: number
+ format: float
+ example: '10.00'
+ balance:
+ description: 'The invoice balance'
+ type: number
+ format: float
+ example: '10.00'
+ paid_to_date:
+ description: 'The amount paid on the invoice to date'
+ type: number
+ format: float
+ example: '10.00'
+ discount:
+ description: 'The invoice discount, can be an amount or a percentage'
+ type: number
+ format: float
+ example: '10.00'
+ partial:
+ description: 'The deposit/partial amount'
+ type: number
+ format: float
+ example: '10.00'
+ is_amount_discount:
+ description: 'Flag determining if the discount is an amount or a percentage'
+ type: boolean
+ example: true
+ is_deleted:
+ description: 'Defines if the invoice has been deleted'
+ type: boolean
+ example: true
+ uses_inclusive_taxes:
+ description: 'Defines the type of taxes used as either inclusive or exclusive'
+ type: boolean
+ example: true
+ date:
+ description: 'The Invoice Date'
+ type: string
+ format: date
+ example: '1994-07-30'
+ last_sent_date:
+ description: 'The last date the invoice was sent out'
+ type: string
+ format: date
+ example: '1994-07-30'
+ next_send_date:
+ description: 'The Next date for a reminder to be sent'
+ type: string
+ format: date
+ example: '1994-07-30'
+ partial_due_date:
+ description: 'The due date for the deposit/partial amount'
+ type: string
+ format: date
+ example: '1994-07-30'
+ due_date:
+ description: 'The due date of the invoice'
+ type: string
+ format: date
+ example: '1994-07-30'
+ settings:
+ $ref: '#/components/schemas/CompanySettings'
+ last_viewed:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ updated_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ archived_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ custom_surcharge1:
+ description: 'First Custom Surcharge'
+ type: number
+ format: float
+ example: '10.00'
+ custom_surcharge2:
+ description: 'Second Custom Surcharge'
+ type: number
+ format: float
+ example: '10.00'
+ custom_surcharge3:
+ description: 'Third Custom Surcharge'
+ type: number
+ format: float
+ example: '10.00'
+ custom_surcharge4:
+ description: 'Fourth Custom Surcharge'
+ type: number
+ format: float
+ example: '10.00'
+ custom_surcharge_tax1:
+ description: 'Toggles charging taxes on custom surcharge amounts'
+ type: boolean
+ example: true
+ custom_surcharge_tax2:
+ description: 'Toggles charging taxes on custom surcharge amounts'
+ type: boolean
+ example: true
+ custom_surcharge_tax3:
+ description: 'Toggles charging taxes on custom surcharge amounts'
+ type: boolean
+ example: true
+ custom_surcharge_tax4:
+ description: 'Toggles charging taxes on custom surcharge amounts'
+ type: boolean
+ example: true
+ type: object
+
+ BankIntegration:
+ properties:
+ id:
+ description: 'The bank integration hashed id'
+ type: string
+ example: AS3df3A
+ user_id:
+ description: 'The user hashed id'
+ type: string
+ example: AS3df3A
+ provider_bank_name:
+ description: 'The providers bank name'
+ type: string
+ example: 'Chase Bank'
+ bank_account_id:
+ description: 'The bank account id'
+ type: integer
+ example: '1233434'
+ bank_account_name:
+ description: 'The name of the account'
+ type: string
+ example: 'My Checking Acc'
+ bank_account_number:
+ description: 'The account number'
+ type: string
+ example: '111 234 2332'
+ bank_account_status:
+ description: 'The status of the bank account'
+ type: string
+ example: ACTIVE
+ bank_account_type:
+ description: 'The type of account'
+ type: string
+ example: CREDITCARD
+ balance:
+ description: 'The current bank balance if available'
+ type: number
+ example: '1000000'
+ currency:
+ description: 'iso_3166_3 code'
+ type: string
+ example: USD
+ type: object
+ Expense:
+ properties:
+ id:
+ description: 'The expense hashed id'
+ type: string
+ example: 'Opnel5aKBz'
+ user_id:
+ description: 'The user hashed id'
+ type: string
+ example: 'Opnel5aKBz'
+ assigned_user_id:
+ description: 'The assigned user hashed id'
+ type: string
+ example: 'Opnel5aKBz'
+ project_id:
+ description: 'The associated project_id'
+ type: string
+ example: 'Opnel5aKBz'
+ client_id:
+ description: 'The client hashed id'
+ type: string
+ example: 'Opnel5aKBz'
+ invoice_id:
+ description: 'The related invoice hashed id'
+ type: string
+ example: 'Opnel5aKBz'
+ bank_id:
+ description: 'The bank id related to this expense'
+ type: string
+ example: ''
+ invoice_currency_id:
+ description: 'The currency id of the related invoice'
+ type: string
+ example: '1'
+ currency_id:
+ description: 'The currency id of the expense'
+ type: string
+ example: '2'
+ invoice_category_id:
+ description: 'The invoice category id'
+ type: string
+ example: 'Opnel5aKBz'
+ payment_type_id:
+ description: 'The payment type id'
+ type: string
+ example: ''
+ recurring_expense_id:
+ description: 'The related recurring expense this expense was created from'
+ type: string
+ example: 'Opnel5aKBz'
+ private_notes:
+ description: 'The private notes of the expense'
+ type: string
+ example: ''
+ public_notes:
+ description: 'The public notes of the expense'
+ type: string
+ example: ''
+ transaction_reference:
+ description: 'The transaction references of the expense'
+ type: string
+ example: ''
+ transcation_id:
+ description: 'The transaction id of the expense'
+ type: string
+ example: ''
+ custom_value1:
+ description: 'A custom value'
+ type: string
+ example: ''
+ custom_value2:
+ description: 'A custom value'
+ type: string
+ example: ''
+ custom_value3:
+ description: 'A custom value'
+ type: string
+ example: ''
+ custom_value4:
+ description: 'A custom value'
+ type: string
+ example: ''
+ tax_amount:
+ description: 'The tax amount'
+ type: number
+ example: 10.00
+ tax_name1:
+ description: 'Tax Name 1'
+ type: string
+ example: 'GST'
+ tax_name2:
+ description: 'Tax Name 2'
+ type: string
+ example: 'VAT'
+ tax_name3:
+ description: 'Tax Name 3'
+ type: string
+ example: 'IVA'
+ tax_rate1:
+ description: 'Tax rate 1'
+ type: number
+ format: float
+ example: '10.00'
+ tax_rate2:
+ description: 'Tax rate 2'
+ type: number
+ format: float
+ example: '10.00'
+ tax_rate3:
+ description: 'Tax rate 3'
+ type: number
+ format: float
+ example: '10.00'
+ amount:
+ description: 'The total expense amont'
+ type: number
+ format: float
+ example: '10.00'
+ foreign_amount:
+ description: 'The total foreign amount of the expense'
+ type: number
+ format: float
+ example: '10.00'
+ exchange_rate:
+ description: 'The exchange rate at the time of the expense'
+ type: number
+ format: float
+ example: '0.80'
+ date:
+ description: 'The expense date format Y-m-d'
+ type: string
+ example: '2022-12-01'
+ payment_date:
+ description: 'The date of payment for the expense, format Y-m-d'
+ type: string
+ example: '2022-12-01'
+ should_be_invoiced:
+ description: 'Flag whether the expense should be invoiced'
+ type: boolean
+ example: true
+ is_deleted:
+ description: 'Boolean determining whether the expense has been deleted'
+ type: boolean
+ example: true
+ invoice_documents:
+ description: 'Passing the expense documents over to the invoice'
+ type: boolean
+ example: true
+ updated_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ archived_at:
+ description: Timestamp
+ type: number
+ format: integer
+ example: '1434342123'
+ type: object
ClientSettings:
required:
- currency_id
@@ -20858,862 +21599,218 @@ components:
type: string
example: 'Bob Smith'
type: object
- RecurringExpense:
+ Quote:
properties:
id:
- description: 'The hashed id of the recurring expense'
+ description: 'The unique hashed identifier for the quote'
type: string
example: Opnel5aKBz
user_id:
- description: 'The hashed id of the user who created the recurring expense'
+ description: 'The unique hashed identifier for the user who created the quote'
type: string
- example: Opnel5aKBz
+ example: ''
assigned_user_id:
- description: 'The hashed id of the user assigned to this recurring expense'
+ description: 'The unique hashed identifier for the user assigned to the quote'
type: string
- example: Opnel5aKBz
+ example: ''
client_id:
- description: 'The hashed id of the client'
- type: string
- example: Opnel5aKBz
- invoice_id:
- description: 'The hashed id of the invoice'
- type: string
- example: Opnel5aKBz
- bank_id:
- description: 'The id of the bank associated with this recurring expense'
- type: string
- example: '22'
- invoice_currency_id:
- description: 'The currency id of the invoice associated with this recurring expense'
- type: string
- example: '1'
- expense_currency_id:
- description: 'The currency id of the expense associated with this recurring expense'
- type: string
- example: '1'
- invoice_category_id:
- description: 'The category id of the invoice'
- type: string
- example: '1'
- payment_type_id:
- description: 'The payment type id'
- type: string
- example: '1'
- private_notes:
- description: 'The recurring expense private notes'
- type: string
- example: 'Private and confidential'
- public_notes:
- description: 'The recurring expense public notes'
- type: string
- example: 'This is the best client in the world'
- transaction_reference:
- description: 'The recurring expense transaction reference'
- type: string
- example: EXP-1223-2333
- transcation_id:
- description: 'The transaction id of the recurring expense'
- type: string
- example: '1233312312'
- custom_value1:
- description: 'Custom value field'
- type: string
- example: $1000
- custom_value2:
- description: 'Custom value field'
- type: string
- example: '2022-10-10'
- custom_value3:
- description: 'Custom value field'
- type: string
- example: 'short text'
- custom_value4:
- description: 'Custom value field'
- type: string
- example: 'very long text'
- tax_name1:
- description: 'The tax name'
- type: string
- example: GST
- tax_name2:
- description: 'The tax name'
- type: string
- example: VAT
- tax_rate1:
- description: 'The tax rate'
- type: number
- format: float
- example: '10.00'
- tax_rate2:
- description: 'The tax rate'
- type: number
- format: float
- example: '10.00'
- tax_name3:
- description: 'The tax name'
+ description: 'The unique hashed identifier for the client associated with the quote'
type: string
example: ''
- tax_rate3:
- description: 'The tax rate'
- type: number
- format: float
- example: '10.00'
- amount:
- description: 'The total amount of the recurring expense'
- type: number
- format: float
- example: '10.00'
- frequency_id:
- description: 'The frequency this recurring expense fires'
- type: number
- format: int
- example: '1'
- remaining_cycles:
- description: 'The number of remaining cycles for this recurring expense'
- type: number
- format: int
- example: '1'
- foreign_amount:
- description: 'The foreign currency amount of the recurring expense'
- type: number
- format: float
- example: '10.00'
- exchange_rate:
- description: 'The exchange rate for the expernse'
- type: number
- format: float
- example: '0.80'
- date:
- description: 'The date of the expense'
- type: string
- example: ''
- payment_date:
- description: 'The date the expense was paid'
- type: string
- example: ''
- should_be_invoiced:
- description: 'Boolean flag determining if the expense should be invoiced'
- type: boolean
- example: true
- is_deleted:
- description: 'Boolean flag determining if the recurring expense is deleted'
- type: boolean
- example: true
- last_sent_date:
- description: 'The Date it was sent last'
- type: string
- format: date
- example: '1994-07-30'
- next_send_date:
- description: 'The next send date'
- type: string
- format: date
- example: '1994-07-30'
- invoice_documents:
- description: 'Boolean flag determining if the documents associated with this expense should be passed onto the invoice if it is converted to an invoice'
- type: boolean
- example: true
- updated_at:
- description: Timestamp
- type: number
- format: integer
- example: '1434342123'
- archived_at:
- description: Timestamp
- type: number
- format: integer
- example: '1434342123'
- type: object
- Activity:
- properties:
- id:
- description: 'The id field of the activity'
- type: string
- example: Opnel5aKBz
- activity_type_id:
- description: 'The activity type id'
- type: string
- example: Opnel5aKBz
- client_id:
- description: 'The client hashed id'
- type: string
- example: Opnel5aKBz
- company_id:
- description: 'The company hashed id'
- type: string
- example: Opnel5aKBz
- user_id:
- description: 'The user hashed id'
- type: string
- example: Opnel5aKBz
- invoice_id:
- description: 'The invoice hashed id'
- type: string
- example: Opnel5aKBz
- payment_id:
- description: 'The payment hashed id'
- type: string
- example: Opnel5aKBz
- credit_id:
- description: 'The credit hashed id'
- type: string
- example: Opnel5aKBz
- updated_at:
- description: 'Unixtimestamp the last time the record was updated'
- type: integer
- example: '343421434'
- expense_id:
- description: 'The expense hashed id'
- type: string
- example: Opnel5aKBz
- is_system:
- description: 'Defines is the activity was performed by the system'
- type: boolean
- example: true
- contact_id:
- description: 'The contact hashed id'
- type: string
- example: Opnel5aKBz
- task_id:
- description: 'The task hashed id'
- type: string
- example: Opnel5aKBz
- notes:
- description: 'Activity Notes'
- type: string
- example: Opnel5aKBz
- token_id:
- description: 'The hashed ID of the token who performed the action'
- type: string
- example: Opnel5aKBz
- ip:
- description: 'The IP Address of the user who performed the action'
- type: string
- example: 192.168.1.252
- user:
- $ref: '#/components/schemas/User'
- client:
- $ref: '#/components/schemas/Client'
- contact:
- $ref: '#/components/schemas/ClientContact'
- recurring_invoice:
- $ref: '#/components/schemas/RecurringInvoice'
- invoice:
- $ref: '#/components/schemas/Invoice'
- credit:
- $ref: '#/components/schemas/Credit'
- quote:
- $ref: '#/components/schemas/Quote'
- payment:
- $ref: '#/components/schemas/Payment'
- expense:
- $ref: '#/components/schemas/Expense'
- task:
- $ref: '#/components/schemas/Task'
- purchase_order:
- $ref: '#/components/schemas/PurchaseOrder'
- vendor:
- $ref: '#/components/schemas/Vendor'
- vendor_contact:
- $ref: '#/components/schemas/VendorContact'
- type: object
- Expense:
- properties:
- id:
- description: 'The expense hashed id'
- type: string
- example: 'Opnel5aKBz'
- user_id:
- description: 'The user hashed id'
- type: string
- example: 'Opnel5aKBz'
- assigned_user_id:
- description: 'The assigned user hashed id'
- type: string
- example: 'Opnel5aKBz'
- project_id:
- description: 'The associated project_id'
- type: string
- example: 'Opnel5aKBz'
- client_id:
- description: 'The client hashed id'
- type: string
- example: 'Opnel5aKBz'
- invoice_id:
- description: 'The related invoice hashed id'
- type: string
- example: 'Opnel5aKBz'
- bank_id:
- description: 'The bank id related to this expense'
- type: string
- example: ''
- invoice_currency_id:
- description: 'The currency id of the related invoice'
- type: string
- example: '1'
- currency_id:
- description: 'The currency id of the expense'
- type: string
- example: '2'
- invoice_category_id:
- description: 'The invoice category id'
- type: string
- example: 'Opnel5aKBz'
- payment_type_id:
- description: 'The payment type id'
- type: string
- example: ''
- recurring_expense_id:
- description: 'The related recurring expense this expense was created from'
- type: string
- example: 'Opnel5aKBz'
- private_notes:
- description: 'The private notes of the expense'
- type: string
- example: ''
- public_notes:
- description: 'The public notes of the expense'
- type: string
- example: ''
- transaction_reference:
- description: 'The transaction references of the expense'
- type: string
- example: ''
- transcation_id:
- description: 'The transaction id of the expense'
- type: string
- example: ''
- custom_value1:
- description: 'A custom value'
- type: string
- example: ''
- custom_value2:
- description: 'A custom value'
- type: string
- example: ''
- custom_value3:
- description: 'A custom value'
- type: string
- example: ''
- custom_value4:
- description: 'A custom value'
- type: string
- example: ''
- tax_amount:
- description: 'The tax amount'
- type: number
- example: 10.00
- tax_name1:
- description: 'Tax Name 1'
- type: string
- example: 'GST'
- tax_name2:
- description: 'Tax Name 2'
- type: string
- example: 'VAT'
- tax_name3:
- description: 'Tax Name 3'
- type: string
- example: 'IVA'
- tax_rate1:
- description: 'Tax rate 1'
- type: number
- format: float
- example: '10.00'
- tax_rate2:
- description: 'Tax rate 2'
- type: number
- format: float
- example: '10.00'
- tax_rate3:
- description: 'Tax rate 3'
- type: number
- format: float
- example: '10.00'
- amount:
- description: 'The total expense amont'
- type: number
- format: float
- example: '10.00'
- foreign_amount:
- description: 'The total foreign amount of the expense'
- type: number
- format: float
- example: '10.00'
- exchange_rate:
- description: 'The exchange rate at the time of the expense'
- type: number
- format: float
- example: '0.80'
- date:
- description: 'The expense date format Y-m-d'
- type: string
- example: '2022-12-01'
- payment_date:
- description: 'The date of payment for the expense, format Y-m-d'
- type: string
- example: '2022-12-01'
- should_be_invoiced:
- description: 'Flag whether the expense should be invoiced'
- type: boolean
- example: true
- is_deleted:
- description: 'Boolean determining whether the expense has been deleted'
- type: boolean
- example: true
- invoice_documents:
- description: 'Passing the expense documents over to the invoice'
- type: boolean
- example: true
- updated_at:
- description: Timestamp
- type: number
- format: integer
- example: '1434342123'
- archived_at:
- description: Timestamp
- type: number
- format: integer
- example: '1434342123'
- type: object
- Error:
- properties:
- message:
- description: 'Something terrible went wrong'
- type: string
- example: 'Unexpected error'
- code:
- description: 'The HTTP error code, ie 5xx 4xx'
- type: integer
- example: '500'
- type: object
- InvoiceInvitation:
- properties:
- id:
- description: 'The entity invitation hashed id'
- type: string
- example: Opnel5aKBz
- readOnly: true
- client_contact_id:
- description: 'The client contact hashed id'
- type: string
- example: Opnel5aKBz
- key:
- description: 'The invitation key'
- type: string
- example: Opnel5aKBz4343343566236gvbb
- readOnly: true
- link:
- description: 'The invitation link'
- type: string
- example: 'https://www.example.com/invitations/Opnel5aKBz4343343566236gvbb'
- readOnly: true
- sent_date:
- description: 'The invitation sent date'
- type: string
- format: date-time
- readOnly: true
- viewed_date:
- description: 'The invitation viewed date'
- type: string
- format: date-time
- readOnly: true
- opened_date:
- description: 'The invitation opened date'
- type: string
- format: date-time
- readOnly: true
- updated_at:
- description: 'Timestamp'
- type: number
- format: integer
- example: '1434342123'
- readOnly: true
- archived_at:
- description: 'Timestamp'
- type: number
- format: integer
- example: '1434342123'
- readOnly: true
- email_error:
- description: 'The email error'
- type: string
- example: 'The email error'
- readOnly: true
- email_status:
- description: 'The email status'
- type: string
- readOnly: true
-
-
- ProductBulkAction:
- required:
- - action
- - ids
- properties:
- action:
- type: string
- example: archive
- description: 'The action to perform ie. archive / restore / delete / set_tax_id'
- ids:
- type: array
- items:
- format: string
- type: string
- example: 2J234DFA,D2J234DFA,D2J234DFA
- description: string array of client hashed ids
- tax_id:
- type: string
- example: '1'
- description: |
- The tax rate id to set on the list of products
-
- The following constants are available (default = '1')
-
- ```
- PRODUCT_TYPE_PHYSICAL = '1'
- PRODUCT_TYPE_SERVICE = '2'
- PRODUCT_TYPE_DIGITAL = '3'
- PRODUCT_TYPE_SHIPPING = '4'
- PRODUCT_TYPE_EXEMPT = '5'
- PRODUCT_TYPE_REDUCED_TAX = '6'
- PRODUCT_TYPE_OVERRIDE_TAX = '7'
- PRODUCT_TYPE_ZERO_RATED = '8'
- PRODUCT_TYPE_REVERSE_TAX = '9'
- ```
- type: object
- User:
- properties:
- id:
- description: 'The hashed id of the user'
- type: string
- example: Opnel5aKBz
- readOnly: true
- first_name:
- description: 'The first name of the user'
- type: string
- example: Brad
- last_name:
- description: 'The last name of the user'
- type: string
- example: Pitt
- email:
- description: 'The users email address'
- type: string
- example: brad@pitt.com
- phone:
- description: 'The users phone number'
- type: string
- example: 555-1233-23232
- signature:
- description: 'The users sign off signature'
- type: string
- example: 'Have a nice day!'
- avatar:
- description: 'The users avatar'
- type: string
- example: 'https://url.to.your/avatar.png'
- accepted_terms_version:
- description: 'The version of the invoice ninja terms that has been accepted by the user'
- type: string
- example: 1.0.1
- readOnly: true
- oauth_user_id:
- description: 'The provider id of the oauth entity'
- type: string
- example: jkhasdf789as6f675sdf768sdfs
- readOnly: true
- oauth_provider_id:
- description: 'The oauth entity id'
- type: string
- example: google
- readOnly: true
- language_id:
- description: 'The language id of the user'
- type: string
- example: 1
- verified_phone_number:
- description: 'Boolean flag if the user has their phone verified. Required to settings up 2FA'
- type: boolean
- example: true
- readOnly: true
- sms_verification_code:
- description: 'The sms verification code for the user. Required to settings up 2FA'
- type: string
- example: '123456'
- readOnly: true
- oauth_user_token_expiry:
- description: 'The expiry date of the oauth token'
- type: string
- example: '2022-10-10'
- readOnly: true
- has_password:
- description: 'Boolean flag determining if the user has a password'
- type: boolean
- example: true
- readOnly: true
- last_confirmed_email_address:
- description: 'The last confirmed email address of the user'
- type: string
- example: 'bob@gmail.com'
- readOnly: true
- custom_value1:
- description: 'A custom value'
- type: string
- example: 'Custom value 1'
- custom_value2:
- description: 'A custom value'
- type: string
- example: '$1000'
- custom_value3:
- description: 'A custom value'
- type: string
- example: 'Custom value 3'
- custom_value4:
- description: 'A custom value'
- type: string
- example: 'Custom value 4'
- is_deleted:
- description: 'Boolean flag determining if the user has been deleted'
- type: boolean
- example: true
- readOnly: true
- google_2fa_secret:
- description: 'The google 2fa secret for the user'
- type: string
- example: '123456'
- readOnly: true
- company_user:
- $ref: '#/components/schemas/CompanyUser'
- type: object
- Account:
- properties:
- id:
- description: 'The account hashed id'
- type: string
- example: AS3df3A
- account_sms_verified:
- description: 'Boolean flag if the account has been verified by sms'
- type: string
- example: true
- type: object
- Credit:
- properties:
- id:
- description: "The unique hashed ID of the credit"
- type: string
- example: Opnel5aKBz
- user_id:
- description: "The unique hashed ID of the user associated with the credit"
- type: string
- example: 1a2b3c4d5e
- assigned_user_id:
- description: "The unique hashed ID of the assigned user responsible for the credit"
- type: string
- example: 6f7g8h9i0j
- client_id:
- description: "The unique hashed ID of the client associated with the credit"
- type: string
- example: p1q2r3s4t5
status_id:
- description: "The ID representing the current status of the credit"
+ description: 'The status of the quote represented by a unique identifier'
type: string
- example: 3
- invoice_id:
- description: "The unique hashed ID of the linked invoice to which the credit is applied"
- type: string
- example: u1v2w3x4y5
+ example: ''
number:
- description: "The unique alphanumeric credit number per company"
+ description: 'The unique alpha-numeric quote number for the quote per company'
type: string
example: QUOTE_101
po_number:
- description: "The purchase order number referred to by the credit"
+ description: 'The purchase order number associated with the quote'
type: string
- example: PO_12345
+ example: PO-1234
terms:
- description: "The terms associated with the credit"
+ description: 'The terms and conditions for the quote'
type: string
- example: "Net 30"
+ example: 'These are some quote terms. Valid for 14 days.'
public_notes:
- description: "Public notes for the credit"
+ description: 'Publicly visible notes associated with the quote'
type: string
- example: "Thank you for your business."
+ example: 'These are public notes which the client may see'
private_notes:
- description: "Private notes for internal use, not visible to the client"
+ description: 'Privately visible notes associated with the quote, not disclosed to the client'
type: string
- example: "Client is requesting a discount."
+ example: 'These are private notes, not to be disclosed to the client'
footer:
- description: "The footer text for the credit"
+ description: 'The footer text of the quote'
type: string
- example: "Footer text goes here."
+ example: 'The text goes in the footer of the quote'
custom_value1:
- description: "Custom value 1 for additional credit information"
+ description: 'First custom value field for additional information'
type: string
- example: "Custom data 1"
+ example: 'A custom value'
custom_value2:
- description: "Custom value 2 for additional credit information"
+ description: 'Second custom value field for additional information'
type: string
- example: "Custom data 2"
+ example: 'A custom value'
custom_value3:
- description: "Custom value 3 for additional credit information"
+ description: 'Third custom value field for additional information'
type: string
- example: "Custom data 3"
+ example: 'A custom value'
custom_value4:
- description: "Custom value 4 for additional credit information"
+ description: 'Fourth custom value field for additional information'
type: string
- example: "Custom data 4"
+ example: 'A custom value'
tax_name1:
- description: "The name of the first tax applied to the credit"
+ description: 'The name of the first tax applied to the quote'
type: string
- example: "VAT"
+ example: GST
tax_name2:
- description: "The name of the second tax applied to the credit"
+ description: 'The name of the second tax applied to the quote'
type: string
- example: "GST"
+ example: VAT
tax_rate1:
- description: "The rate of the first tax applied to the credit"
+ description: 'The rate of the first tax applied to the quote'
type: number
format: float
example: 10.00
tax_rate2:
- description: "The rate of the second tax applied to the credit"
+ description: 'The rate of the second tax applied to the quote'
type: number
format: float
- example: 5.00
+ example: 10.00
tax_name3:
- description: "The name of the third tax applied to the credit"
+ description: 'The name of the third tax applied to the quote'
type: string
- example: "PST"
+ example: ''
tax_rate3:
- description: "The rate of the third tax applied to the credit"
+ description: 'The rate of the third tax applied to the quote'
type: number
format: float
- example: 8.00
+ example: 10.00
total_taxes:
- description: "The total amount of taxes for the credit"
+ description: 'The total amount of taxes for the quote'
type: number
format: float
- example: 23.00
+ example: 10.00
line_items:
type: array
- description: 'An array of objects which define the line items of the credit'
+ description: 'An array of objects which define the line items of the quote'
items:
$ref: '#/components/schemas/InvoiceItem'
amount:
- description: "The total amount of the credit"
+ description: 'The total amount of the quote before taxes and discounts'
type: number
format: float
- example: 100.00
+ example: 10.00
balance:
- description: "The outstanding balance of the credit"
+ description: 'The balance due for the quote after accounting for payments'
type: number
format: float
- example: 50.00
+ example: 10.00
paid_to_date:
- description: "The total amount paid to date for the credit"
+ description: 'The total amount paid on the quote so far'
type: number
format: float
- example: 50.00
+ example: 10.00
discount:
- description: "The discount applied to the credit"
+ description: 'The discount amount or percentage applied to the quote'
type: number
format: float
example: 10.00
partial:
- description: "The partial amount applied to the credit"
+ description: 'The partial or deposit amount for the quote'
type: number
format: float
- example: 20.00
+ example: 10.00
is_amount_discount:
- description: "Indicates whether the discount applied is a fixed amount or a percentage"
+ description: 'Boolean flag indicating if the discount is a fixed amount or a percentage'
type: boolean
example: true
is_deleted:
- description: "Indicates whether the credit has been deleted"
+ description: 'Boolean flag indicating if the quote has been deleted'
type: boolean
example: false
uses_inclusive_taxes:
- description: "Indicates whether the tax rates applied to the credit are inclusive or exclusive"
+ description: 'Boolean flag indicating if the taxes used are inclusive or exclusive'
type: boolean
example: true
date:
- description: "The date the credit was issued"
+ description: 'The date the quote was created'
type: string
format: date
- example: "1994-07-30"
+ example: '1994-07-30'
last_sent_date:
- description: "The date the credit was last sent out"
+ description: 'The last date the quote was sent to the client'
type: string
format: date
- example: "1994-07-30"
+ example: '1994-07-30'
next_send_date:
- description: "The next scheduled date for sending a credit reminder"
+ description: 'The next scheduled date for sending a reminder for the quote'
type: string
format: date
- example: "1994-07-30"
+ example: '1994-07-30'
partial_due_date:
- description: "The due date for the partial amount of the credit"
+ description: 'The due date for the partial or deposit amount'
type: string
format: date
- example: "1994-07-30"
+ example: '1994-07-30'
due_date:
- description: "The due date for the total amount of the credit"
+ description: 'The due date for the total amount of the quote'
type: string
format: date
- example: "1994-07-30"
+ example: '1994-07-30'
settings:
- $ref: "#/components/schemas/CompanySettings"
+ $ref: '#/components/schemas/CompanySettings'
last_viewed:
- description: "The timestamp of the last time the credit was viewed"
+ description: 'The timestamp of the last time the quote was viewed'
type: number
format: integer
example: 1434342123
updated_at:
- description: "The timestamp of the last time the credit was updated"
+ description: 'The timestamp of the last update to the quote'
type: number
format: integer
example: 1434342123
archived_at:
- description: "The timestamp of the last time the credit was archived"
+ description: 'The timestamp of when the quote was archived'
type: number
format: integer
example: 1434342123
custom_surcharge1:
- description: "First custom surcharge amount"
+ description: 'First custom surcharge amount for the quote'
type: number
format: float
example: 10.00
custom_surcharge2:
- description: 'Second Custom Surcharge'
+ description: 'Second custom surcharge amount for the quote'
type: number
format: float
- example: '10.00'
+ example: 10.00
custom_surcharge3:
- description: 'Third Custom Surcharge'
+ description: 'Third custom surcharge amount for the quote'
type: number
format: float
- example: '10.00'
+ example: 10.00
custom_surcharge4:
- description: 'Fourth Custom Surcharge'
+ description: 'Fourth custom surcharge amount for the quote'
type: number
format: float
- example: '10.00'
+ example: 10.00
custom_surcharge_tax1:
- description: 'Toggles charging taxes on custom surcharge amounts'
+ description: 'Boolean flag indicating if taxes are charged on the first custom surcharge amount'
type: boolean
example: true
custom_surcharge_tax2:
- description: 'Toggles charging taxes on custom surcharge amounts'
+ description: 'Boolean flag indicating if taxes are charged on the second custom surcharge amount'
type: boolean
example: true
custom_surcharge_tax3:
- description: 'Toggles charging taxes on custom surcharge amounts'
+ description: 'Boolean flag indicating if taxes are charged on the third custom surcharge amount'
type: boolean
example: true
custom_surcharge_tax4:
- description: 'Toggles charging taxes on custom surcharge amounts'
+ description: 'Boolean flag indicating if taxes are charged on the fourth custom surcharge amount'
type: boolean
example: true
type: object
@@ -21770,7 +21867,7 @@ tags:
description: |
Endpoint definitions for interacting with reports.
externalDocs:
- description: "https://invoiceninja.github.io"
- url: "https://invoiceninja.github.io"
+ description: "https://invoiceninja.github.io"
+ url: "https://invoiceninja.github.io"
security:
- - ApiKeyAuth: []
+ - ApiKeyAuth: []
diff --git a/openapi/components/parameters.yaml b/openapi/components/parameters.yaml
index 8da9f525df08..ece96fa8a7b9 100644
--- a/openapi/components/parameters.yaml
+++ b/openapi/components/parameters.yaml
@@ -123,16 +123,16 @@
examples:
user:
value: user
- summary: include=user will include the user object in the response
+ summary: include=user will include the Cser object in the response
company:
value: company
- summary: include=company will include the company object in the response
+ summary: include=company will include the Company object in the response
token:
value: token
- summary: include=token will include the token object in the response
+ summary: include=token will include the Company Token object in the response
account:
value: account
- summary: include=account will include the account object in the response
+ summary: include=account will include the Account object in the response
per_page_meta:
name: per_page
in: query
@@ -160,7 +160,15 @@
include_static:
name: include_static
in: query
- description: 'Returns static variables'
+ description: |
+ Static variables include:
+ - Currencies
+ - Countries
+ - Languages
+ - Payment Types
+ - Email Templatees
+ - Industries
+
required: false
schema:
type: string
@@ -168,7 +176,11 @@
clear_cache:
name: clear_cache
in: query
- description: 'Clears the static cache'
+ description: |
+ Clears cache
+
+ Sometimes after a system update where the static variables have been updated, it may be necessary to clear the cache so that the static variables repopulate
+
required: false
schema:
type: string
diff --git a/openapi/components/schemas/company_settings.yaml b/openapi/components/schemas/company_settings.yaml
index 2ee34f675f99..f04eab09d7b6 100644
--- a/openapi/components/schemas/company_settings.yaml
+++ b/openapi/components/schemas/company_settings.yaml
@@ -1,842 +1,842 @@
-CompanySettings:
- required:
- - currency_id
- properties:
- currency_id:
- description: "The default currency id"
- type: string
- example: true
- timezone_id:
- description: "The timezone id"
- type: string
- example: "15"
- date_format_id:
- description: "The date format id"
- type: string
- example: "15"
- military_time:
- description: "Toggles 12/24 hour time"
- type: boolean
- example: true
- language_id:
- description: "The language id"
- type: string
- example: "1"
- show_currency_code:
- description: "Toggles whether the currency symbol or code is shown"
- type: boolean
- example: true
- payment_terms:
- description: "-1 sets no payment term, 0 sets payment due immediately, positive integers indicates payment terms in days"
- type: integer
- example: "1"
- company_gateway_ids:
- description: "A commad separate list of available gateways"
- type: string
- example: "1,2,3,4"
- custom_value1:
- description: "A Custom Label"
- type: string
- example: "Custom Label"
- custom_value2:
- description: "A Custom Label"
- type: string
- example: "Custom Label"
- custom_value3:
- description: "A Custom Label"
- type: string
- example: "Custom Label"
- custom_value4:
- description: "A Custom Label"
- type: string
- example: "Custom Label"
- default_task_rate:
- description: "The default task rate"
- type: number
- format: float
- example: "10.00"
- send_reminders:
- description: "Toggles whether reminders are sent"
- type: boolean
- example: true
- enable_client_portal_tasks:
- description: "Show/hide the tasks panel in the client portal"
- type: boolean
- example: true
- email_style:
- description: "options include plain,light,dark,custom"
- type: string
- example: light
- reply_to_email:
- description: "The reply to email address"
- type: string
- example: email@gmail.com
- bcc_email:
- description: "A comma separate list of BCC emails"
- type: string
- example: "email@gmail.com, contact@gmail.com"
- pdf_email_attachment:
- description: "Toggles whether to attach PDF as attachment"
- type: boolean
- example: true
- ubl_email_attachment:
- description: "Toggles whether to attach UBL as attachment"
- type: boolean
- example: true
- email_style_custom:
- description: "The custom template"
- type: string
- example: ""
- counter_number_applied:
- description: "enum when the invoice number counter is set, ie when_saved, when_sent, when_paid"
- type: string
- example: when_sent
- quote_number_applied:
- description: "enum when the quote number counter is set, ie when_saved, when_sent"
- type: string
- example: when_sent
- custom_message_dashboard:
- description: "A custom message which is displayed on the dashboard"
- type: string
- example: "Please pay invoices immediately"
- custom_message_unpaid_invoice:
- description: "A custom message which is displayed in the client portal when a client is viewing a unpaid invoice."
- type: string
- example: "Please pay invoices immediately"
- custom_message_paid_invoice:
- description: "A custom message which is displayed in the client portal when a client is viewing a paid invoice."
- type: string
- example: "Thanks for paying this invoice!"
- custom_message_unapproved_quote:
- description: "A custom message which is displayed in the client portal when a client is viewing a unapproved quote."
- type: string
- example: "Please approve quote"
- lock_invoices:
- description: "Toggles whether invoices are locked once sent and cannot be modified further"
- type: boolean
- example: true
- auto_archive_invoice:
- description: "Toggles whether a invoice is archived immediately following payment"
- type: boolean
- example: true
- auto_archive_quote:
- description: "Toggles whether a quote is archived after being converted to a invoice"
- type: boolean
- example: true
- auto_convert_quote:
- description: "Toggles whether a quote is converted to a invoice when approved"
- type: boolean
- example: true
- inclusive_taxes:
- description: "Boolean flag determining whether inclusive or exclusive taxes are used"
- type: boolean
- example: true
- translations:
- description: "JSON payload of customized translations"
- type: object
- example: ""
- task_number_pattern:
- description: "Allows customisation of the task number pattern"
- type: string
- example: "{$year}-{$counter}"
- task_number_counter:
- description: "The incrementing counter for tasks"
- type: integer
- example: "1"
- reminder_send_time:
- description: "Time from UTC +0 when the email will be sent to the client"
- type: integer
- example: "32400"
- expense_number_pattern:
- description: "Allows customisation of the expense number pattern"
- type: string
- example: "{$year}-{$counter}"
- expense_number_counter:
- description: "The incrementing counter for expenses"
- type: integer
- example: "1"
- vendor_number_pattern:
- description: "Allows customisation of the vendor number pattern"
- type: string
- example: "{$year}-{$counter}"
- vendor_number_counter:
- description: "The incrementing counter for vendors"
- type: integer
- example: "1"
- ticket_number_pattern:
- description: "Allows customisation of the ticket number pattern"
- type: string
- example: "{$year}-{$counter}"
- ticket_number_counter:
- description: "The incrementing counter for tickets"
- type: integer
- example: "1"
- payment_number_pattern:
- description: "Allows customisation of the payment number pattern"
- type: string
- example: "{$year}-{$counter}"
- payment_number_counter:
- description: "The incrementing counter for payments"
- type: integer
- example: "1"
- invoice_number_pattern:
- description: "Allows customisation of the invoice number pattern"
- type: string
- example: "{$year}-{$counter}"
- invoice_number_counter:
- description: "The incrementing counter for invoices"
- type: integer
- example: "1"
- quote_number_pattern:
- description: "Allows customisation of the quote number pattern"
- type: string
- example: "{$year}-{$counter}"
- quote_number_counter:
- description: "The incrementing counter for quotes"
- type: integer
- example: "1"
- client_number_pattern:
- description: "Allows customisation of the client number pattern"
- type: string
- example: "{$year}-{$counter}"
- client_number_counter:
- description: "The incrementing counter for clients"
- type: integer
- example: "1"
- credit_number_pattern:
- description: "Allows customisation of the credit number pattern"
- type: string
- example: "{$year}-{$counter}"
- credit_number_counter:
- description: "The incrementing counter for credits"
- type: integer
- example: "1"
- recurring_invoice_number_prefix:
- description: "This string is prepended to the recurring invoice number"
- type: string
- example: R
- reset_counter_frequency_id:
- description: "CONSTANT which is used to apply the frequency which the counters are reset"
- type: integer
- example: "1"
- reset_counter_date:
- description: "The explicit date which is used to reset counters"
- type: string
- example: "2019-01-01"
- counter_padding:
- description: "Pads the counter with leading zeros"
- type: integer
- example: "1"
- shared_invoice_quote_counter:
- description: "Flags whether to share the counter for invoices and quotes"
- type: boolean
- example: true
- update_products:
- description: "Determines if client fields are updated from third party APIs"
- type: boolean
- example: true
- convert_products:
- description: ""
- type: boolean
- example: true
- fill_products:
- description: "Automatically fill products based on product_key"
- type: boolean
- example: true
- invoice_terms:
- description: "The default invoice terms"
- type: string
- example: "Invoice Terms are..."
- quote_terms:
- description: "The default quote terms"
- type: string
- example: "Quote Terms are..."
- invoice_taxes:
- description: "Taxes can be applied to the invoice"
- type: number
- example: "1"
- invoice_design_id:
- description: "The default design id (invoice, quote etc)"
- type: string
- example: "1"
- quote_design_id:
- description: "The default design id (invoice, quote etc)"
- type: string
- example: "1"
- invoice_footer:
- description: "The default invoice footer"
- type: string
- example: "1"
- invoice_labels:
- description: "JSON string of invoice labels"
- type: string
- example: "1"
- tax_rate1:
- description: "The tax rate (float)"
- type: number
- example: "10"
- tax_name1:
- description: "The tax name"
- type: string
- example: GST
- tax_rate2:
- description: "The tax rate (float)"
- type: number
- example: "10"
- tax_name2:
- description: "The tax name"
- type: string
- example: GST
- tax_rate3:
- description: "The tax rate (float)"
- type: number
- example: "10"
- tax_name3:
- description: "The tax name"
- type: string
- example: GST
- payment_type_id:
- description: "The default payment type id"
- type: string
- example: "1"
- custom_fields:
- description: "JSON string of custom fields"
- type: string
- example: "{}"
- email_footer:
- description: "The default email footer"
- type: string
- example: "A default email footer"
- email_sending_method:
- description: "The email driver to use to send email, options include default, gmail, client_postmark, client_mailgun, client_brevo, office365"
- type: string
- example: default
- gmail_sending_user_id:
- description: "The hashed_id of the user account to send email from"
- type: string
- example: F76sd34D
- email_subject_invoice:
- description: ""
- type: string
- example: "Your Invoice Subject"
- email_subject_quote:
- description: ""
- type: string
- example: "Your Quote Subject"
- email_subject_payment:
- description: ""
- type: string
- example: "Your Payment Subject"
- email_template_invoice:
- description: "The full template for invoice emails"
- type: string
- example: ""
- email_template_quote:
- description: "The full template for quote emails"
- type: string
- example: ""
- email_template_payment:
- description: "The full template for payment emails"
- type: string
- example: ""
- email_subject_reminder1:
- description: "Email subject for Reminder"
- type: string
- example: ""
- email_subject_reminder2:
- description: "Email subject for Reminder"
- type: string
- example: ""
- email_subject_reminder3:
- description: "Email subject for Reminder"
- type: string
- example: ""
- email_subject_reminder_endless:
- description: "Email subject for endless reminders"
- type: string
- example: ""
- email_template_reminder1:
- description: "The full template for Reminder 1"
- type: string
- example: ""
- email_template_reminder2:
- description: "The full template for Reminder 2"
- type: string
- example: ""
- email_template_reminder3:
- description: "The full template for Reminder 3"
- type: string
- example: ""
- email_template_reminder_endless:
- description: "The full template for enless reminders"
- type: string
- example: ""
- enable_portal_password:
- description: "Toggles whether a password is required to log into the client portal"
- type: boolean
- example: true
- show_accept_invoice_terms:
- description: "Toggles whether the terms dialogue is shown to the client"
- type: boolean
- example: true
- show_accept_quote_terms:
- description: "Toggles whether the terms dialogue is shown to the client"
- type: boolean
- example: true
- require_invoice_signature:
- description: "Toggles whether a invoice signature is required"
- type: boolean
- example: true
- require_quote_signature:
- description: "Toggles whether a quote signature is required"
- type: boolean
- example: true
- name:
- description: "The company name"
- type: string
- example: "Acme Co"
- company_logo:
- description: "The company logo file"
- type: object
- example: logo.png
- website:
- description: "The company website URL"
- type: string
- example: www.acme.com
- address1:
- description: "The company address line 1"
- type: string
- example: "Suite 888"
- address2:
- description: "The company address line 2"
- type: string
- example: "5 Jimbo Way"
- city:
- description: "The company city"
- type: string
- example: Sydney
- state:
- description: "The company state"
- type: string
- example: Florisa
- postal_code:
- description: "The company zip/postal code"
- type: string
- example: "90210"
- phone:
- description: "The company phone"
- type: string
- example: 555-213-3948
- email:
- description: "The company email"
- type: string
- example: joe@acme.co
- country_id:
- description: "The country ID"
- type: string
- example: "1"
- vat_number:
- description: "The company VAT/TAX ID number"
- type: string
- example: "32 120 377 720"
- page_size:
- description: "The default page size"
- type: string
- example: A4
- font_size:
- description: "The font size"
- type: number
- example: "9"
- primary_font:
- description: "The primary font"
- type: string
- example: roboto
- secondary_font:
- description: "The secondary font"
- type: string
- example: roboto
- hide_paid_to_date:
- description: "Flags whether to hide the paid to date field"
- type: boolean
- example: false
- embed_documents:
- description: "Toggled whether to embed documents in the PDF"
- type: boolean
- example: false
- all_pages_header:
- description: "The header for the PDF"
- type: boolean
- example: false
- all_pages_footer:
- description: "The footer for the PDF"
- type: boolean
- example: false
- document_email_attachment:
- description: "Toggles whether to attach documents in the email"
- type: boolean
- example: false
- enable_client_portal_password:
- description: "Toggles password protection of the client portal"
- type: boolean
- example: false
- enable_email_markup:
- description: "Toggles the use of markdown in emails"
- type: boolean
- example: false
- enable_client_portal_dashboard:
- description: "Toggles whether the client dashboard is shown in the client portal"
- type: boolean
- example: false
- enable_client_portal:
- description: "Toggles whether the entire client portal is displayed to the client, or only the context"
- type: boolean
- example: false
- email_template_statement:
- description: "The body of the email for statements"
- type: string
- example: "template matter"
- email_subject_statement:
- description: "The subject of the email for statements"
- type: string
- example: "subject matter"
- signature_on_pdf:
- description: "Toggles whether the signature (if available) is displayed on the PDF"
- type: boolean
- example: false
- quote_footer:
- description: "The default quote footer"
- type: string
- example: "the quote footer"
- email_subject_custom1:
- description: "Custom reminder template subject"
- type: string
- example: "Custom Subject 1"
- email_subject_custom2:
- description: "Custom reminder template subject"
- type: string
- example: "Custom Subject 2"
- email_subject_custom3:
- description: "Custom reminder template subject"
- type: string
- example: "Custom Subject 3"
- email_template_custom1:
- description: "Custom reminder template body"
- type: string
- example: ""
- email_template_custom2:
- description: "Custom reminder template body"
- type: string
- example: ""
- email_template_custom3:
- description: "Custom reminder template body"
- type: string
- example: ""
- enable_reminder1:
- description: "Toggles whether this reminder is enabled"
- type: boolean
- example: false
- enable_reminder2:
- description: "Toggles whether this reminder is enabled"
- type: boolean
- example: false
- enable_reminder3:
- description: "Toggles whether this reminder is enabled"
- type: boolean
- example: false
- num_days_reminder1:
- description: "The Reminder interval"
- type: number
- example: "9"
- num_days_reminder2:
- description: "The Reminder interval"
- type: number
- example: "9"
- num_days_reminder3:
- description: "The Reminder interval"
- type: number
- example: "9"
- schedule_reminder1:
- description: "(enum: after_invoice_date, before_due_date, after_due_date)"
- type: string
- example: after_invoice_date
- schedule_reminder2:
- description: "(enum: after_invoice_date, before_due_date, after_due_date)"
- type: string
- example: after_invoice_date
- schedule_reminder3:
- description: "(enum: after_invoice_date, before_due_date, after_due_date)"
- type: string
- example: after_invoice_date
- late_fee_amount1:
- description: "The late fee amount for reminder 1"
- type: number
- example: 10
- late_fee_amount2:
- description: "The late fee amount for reminder 2"
- type: number
- example: 20
- late_fee_amount3:
- description: "The late fee amount for reminder 2"
- type: number
- example: 100
- endless_reminder_frequency_id:
- description: "The frequency id of the endless reminder"
- type: string
- example: "1"
- client_online_payment_notification:
- description: "Determines if a client should receive the notification for a online payment"
- type: boolean
- example: false
- client_manual_payment_notification:
- description: "Determines if a client should receive the notification for a manually entered payment"
- type: boolean
- example: false
- enable_e_invoice:
- description: "Determines if e-invoicing is enabled"
- type: boolean
- example: false
- default_expense_payment_type_id:
- description: "The default payment type for expenses"
- type: string
- example: "0"
- e_invoice_type:
- description: "The e-invoice type"
- type: string
- example: "EN16931"
- mailgun_endpoint:
- description: "The mailgun endpoint - used to determine whether US or EU endpoints are used"
- type: string
- example: "api.mailgun.net or api.eu.mailgun.net"
- client_initiated_payments:
- description: "Determines if clients can initiate payments directly from the client portal"
- type: boolean
- example: false
- client_initiated_payments_minimum:
- description: "The minimum amount a client can pay"
- type: number
- example: 10
- sync_invoice_quote_columns:
- description: "Determines if invoice and quote columns are synced for the PDF rendering, or if they use their own columns"
- type: boolean
- example: false
- show_task_item_description:
- description: "Determines if the task item description is shown on the invoice"
- type: boolean
- example: false
- allow_billable_task_items:
- description: "Determines if task items can be marked as billable"
- type: boolean
- example: false
- accept_client_input_quote_approval:
- description: "Determines if clients can approve quotes and also pass through a PO Number reference"
- type: boolean
- example: false
- custom_sending_email:
- description: "When using Mailgun or Postmark, the FROM email address can be customized using this setting."
- type: string
- example: "bob@gmail.com"
- show_paid_stamp:
- description: "Determines if the PAID stamp is shown on the invoice"
- type: boolean
- example: false
- show_shipping_address:
- description: "Determines if the shipping address is shown on the invoice"
- type: boolean
- example: false
- company_logo_size:
- description: "The size of the company logo on the PDF - percentage value between 0 and 100"
- type: number
- example: 100
- show_email_footer:
- description: "Determines if the email footer is shown on emails"
- type: boolean
- example: false
- email_alignment:
- description: "The alignment of the email body text, options include left / center / right"
- type: string
- example: "left"
- auto_bill_standard_invoices:
- description: "Determines if standard invoices are automatically billed when they are created or due"
- type: boolean
- example: false
- postmark_secret:
- description: "The Postmark secret API key"
- type: string
- example: "123456"
- mailgun_secret:
- description: "The Mailgun secret API key"
- type: string
- example: "123456"
- mailgun_domain:
- description: "The Mailgun domain"
- type: string
- example: "sandbox123456.mailgun.org"
- send_email_on_mark_paid:
- description: "Determines if an email is sent when an invoice is marked as paid"
- type: boolean
- example: false
- vendor_portal_enable_uploads:
- description: "Determines if vendors can upload files to the portal"
- type: boolean
- example: false
- besr_id:
- description: "The BESR ID"
- type: string
- example: "123456"
- qr_iban:
- description: "The IBAN for the QR code"
- type: string
- example: "CH123456"
- email_subject_purchase_order:
- description: "The email subject for purchase orders"
- type: string
- example: "Purchase Order"
- email_template_purchase_order:
- description: "The email template for purchase orders"
- type: string
- example: "Please see attached your purchase order."
- require_purchase_order_signature:
- description: "Determines if a signature is required on purchase orders"
- type: boolean
- example: false
- purchase_order_public_notes:
- description: "The public notes for purchase orders"
- type: string
- example: "Please see attached your purchase order."
- purchase_order_terms:
- description: "The terms for purchase orders"
- type: string
- example: "Please see attached your purchase order."
- purchase_order_footer:
- description: "The footer for purchase orders"
- type: string
- example: "Please see attached your purchase order."
- purchase_order_design_id:
- description: "The design id for purchase orders"
- type: string
- example: "hd677df"
- purchase_order_number_pattern:
- description: "The pattern for purchase order numbers"
- type: string
- example: "PO-000000"
- purchase_order_number_counter:
- description: "The counter for purchase order numbers"
- type: number
- example: 1
- page_numbering_alignment:
- description: "The alignment for page numbering: options include left / center / right"
- type: string
- example: "left"
- page_numbering:
- description: "Determines if page numbering is enabled on Document PDFs"
- type: boolean
- example: false
- auto_archive_invoice_cancelled:
- description: "Determines if invoices are automatically archived when they are cancelled"
- type: boolean
- example: false
- email_from_name:
- description: "The FROM name for emails when using Custom emailers"
- type: string
- example: "Bob Smith"
- show_all_tasks_client_portal:
- description: "Determines if all tasks are shown on the client portal"
- type: boolean
- example: false
- entity_send_time:
- description: "The time that emails are sent. The time is localized to the clients locale, integer values from 1 - 24"
- type: integer
- example: 9
- shared_invoice_credit_counter:
- description: "Determines if the invoice and credit counter are shared"
- type: boolean
- example: false
- reply_to_name:
- description: "The reply to name for emails"
- type: string
- example: "Bob Smith"
- hide_empty_columns_on_pdf:
- description: "Determines if empty columns are hidden on PDFs"
- type: boolean
- example: false
- enable_reminder_endless:
- description: "Determines if endless reminders are enabled"
- type: boolean
- example: false
- use_credits_payment:
- description: "Determines if credits can be used as a payment method"
- type: boolean
- example: false
- recurring_invoice_number_pattern:
- description: "The pattern for recurring invoice numbers"
- type: string
- example: "R-000000"
- recurring_invoice_number_counter:
- description: "The counter for recurring invoice numbers"
- type: number
- example: 1
- client_portal_under_payment_minimum:
- description: "The minimum payment payment"
- type: number
- example: 10
- auto_bill_date:
- description: "Determines when the invoices are auto billed, options are on_send_date (when the invoice is sent) or on_due_date (when the invoice is due))"
- type: string
- example: "on_send_date"
- primary_color:
- description: "The primary color for the client portal / document highlights"
- type: string
- example: "#ffffff"
- secondary_color:
- description: "The secondary color for the client portal / document highlights"
- type: string
- example: "#ffffff"
- client_portal_allow_under_payment:
- description: "Determines if clients can pay invoices under the invoice amount due"
- type: boolean
- example: false
- client_portal_allow_over_payment:
- description: "Determines if clients can pay invoices over the invoice amount"
- type: boolean
- example: false
- auto_bill:
- description: "Determines how autobilling is applied for recurring invoices. off (no auto billed), always (always auto bill), optin (The user must opt in to auto billing), optout (The user must opt out of auto billing"
- type: string
- example: "off"
- client_portal_terms:
- description: "The terms which are displayed on the client portal"
- type: string
- example: "Please see attached your invoice."
- client_portal_privacy_policy:
- description: "The privacy policy which is displayed on the client portal"
- type: string
- example: "These are the terms of use for using the client portal."
- client_can_register:
- description: "Determines if clients can register on the client portal"
- type: boolean
- example: false
- portal_design_id:
- description: "The design id for the client portal"
- type: string
- example: "hd677df"
- late_fee_endless_percent:
- description: "The late fee percentage for endless late fees"
- type: number
- example: 10
- late_fee_endless_amount:
- description: "The late fee amount for endless late fees"
- type: number
- example: 10
- auto_email_invoice:
- description: "Determines if invoices are automatically emailed when they are created"
- type: boolean
- example: false
- email_signature:
- description: "The email signature for emails"
- type: string
- example: "Bob Smith"
- classification:
- description: "The classification for the company"
- type: string
- example: "individual"
- type: object
+ CompanySettings:
+ required:
+ - currency_id
+ properties:
+ currency_id:
+ description: "The default currency id"
+ type: string
+ example: true
+ timezone_id:
+ description: "The timezone id"
+ type: string
+ example: "15"
+ date_format_id:
+ description: "The date format id"
+ type: string
+ example: "15"
+ military_time:
+ description: "Toggles 12/24 hour time"
+ type: boolean
+ example: true
+ language_id:
+ description: "The language id"
+ type: string
+ example: "1"
+ show_currency_code:
+ description: "Toggles whether the currency symbol or code is shown"
+ type: boolean
+ example: true
+ payment_terms:
+ description: "-1 sets no payment term, 0 sets payment due immediately, positive integers indicates payment terms in days"
+ type: integer
+ example: "1"
+ company_gateway_ids:
+ description: "A commad separate list of available gateways"
+ type: string
+ example: "1,2,3,4"
+ custom_value1:
+ description: "A Custom Label"
+ type: string
+ example: "Custom Label"
+ custom_value2:
+ description: "A Custom Label"
+ type: string
+ example: "Custom Label"
+ custom_value3:
+ description: "A Custom Label"
+ type: string
+ example: "Custom Label"
+ custom_value4:
+ description: "A Custom Label"
+ type: string
+ example: "Custom Label"
+ default_task_rate:
+ description: "The default task rate"
+ type: number
+ format: float
+ example: "10.00"
+ send_reminders:
+ description: "Toggles whether reminders are sent"
+ type: boolean
+ example: true
+ enable_client_portal_tasks:
+ description: "Show/hide the tasks panel in the client portal"
+ type: boolean
+ example: true
+ email_style:
+ description: "options include plain,light,dark,custom"
+ type: string
+ example: light
+ reply_to_email:
+ description: "The reply to email address"
+ type: string
+ example: email@gmail.com
+ bcc_email:
+ description: "A comma separate list of BCC emails"
+ type: string
+ example: "email@gmail.com, contact@gmail.com"
+ pdf_email_attachment:
+ description: "Toggles whether to attach PDF as attachment"
+ type: boolean
+ example: true
+ ubl_email_attachment:
+ description: "Toggles whether to attach UBL as attachment"
+ type: boolean
+ example: true
+ email_style_custom:
+ description: "The custom template"
+ type: string
+ example: ""
+ counter_number_applied:
+ description: "enum when the invoice number counter is set, ie when_saved, when_sent, when_paid"
+ type: string
+ example: when_sent
+ quote_number_applied:
+ description: "enum when the quote number counter is set, ie when_saved, when_sent"
+ type: string
+ example: when_sent
+ custom_message_dashboard:
+ description: "A custom message which is displayed on the dashboard"
+ type: string
+ example: "Please pay invoices immediately"
+ custom_message_unpaid_invoice:
+ description: "A custom message which is displayed in the client portal when a client is viewing a unpaid invoice."
+ type: string
+ example: "Please pay invoices immediately"
+ custom_message_paid_invoice:
+ description: "A custom message which is displayed in the client portal when a client is viewing a paid invoice."
+ type: string
+ example: "Thanks for paying this invoice!"
+ custom_message_unapproved_quote:
+ description: "A custom message which is displayed in the client portal when a client is viewing a unapproved quote."
+ type: string
+ example: "Please approve quote"
+ lock_invoices:
+ description: "Toggles whether invoices are locked once sent and cannot be modified further"
+ type: boolean
+ example: true
+ auto_archive_invoice:
+ description: "Toggles whether a invoice is archived immediately following payment"
+ type: boolean
+ example: true
+ auto_archive_quote:
+ description: "Toggles whether a quote is archived after being converted to a invoice"
+ type: boolean
+ example: true
+ auto_convert_quote:
+ description: "Toggles whether a quote is converted to a invoice when approved"
+ type: boolean
+ example: true
+ inclusive_taxes:
+ description: "Boolean flag determining whether inclusive or exclusive taxes are used"
+ type: boolean
+ example: true
+ translations:
+ description: "JSON payload of customized translations"
+ type: object
+ example: ""
+ task_number_pattern:
+ description: "Allows customisation of the task number pattern"
+ type: string
+ example: "{$year}-{$counter}"
+ task_number_counter:
+ description: "The incrementing counter for tasks"
+ type: integer
+ example: "1"
+ reminder_send_time:
+ description: "Time from UTC +0 when the email will be sent to the client"
+ type: integer
+ example: "32400"
+ expense_number_pattern:
+ description: "Allows customisation of the expense number pattern"
+ type: string
+ example: "{$year}-{$counter}"
+ expense_number_counter:
+ description: "The incrementing counter for expenses"
+ type: integer
+ example: "1"
+ vendor_number_pattern:
+ description: "Allows customisation of the vendor number pattern"
+ type: string
+ example: "{$year}-{$counter}"
+ vendor_number_counter:
+ description: "The incrementing counter for vendors"
+ type: integer
+ example: "1"
+ ticket_number_pattern:
+ description: "Allows customisation of the ticket number pattern"
+ type: string
+ example: "{$year}-{$counter}"
+ ticket_number_counter:
+ description: "The incrementing counter for tickets"
+ type: integer
+ example: "1"
+ payment_number_pattern:
+ description: "Allows customisation of the payment number pattern"
+ type: string
+ example: "{$year}-{$counter}"
+ payment_number_counter:
+ description: "The incrementing counter for payments"
+ type: integer
+ example: "1"
+ invoice_number_pattern:
+ description: "Allows customisation of the invoice number pattern"
+ type: string
+ example: "{$year}-{$counter}"
+ invoice_number_counter:
+ description: "The incrementing counter for invoices"
+ type: integer
+ example: "1"
+ quote_number_pattern:
+ description: "Allows customisation of the quote number pattern"
+ type: string
+ example: "{$year}-{$counter}"
+ quote_number_counter:
+ description: "The incrementing counter for quotes"
+ type: integer
+ example: "1"
+ client_number_pattern:
+ description: "Allows customisation of the client number pattern"
+ type: string
+ example: "{$year}-{$counter}"
+ client_number_counter:
+ description: "The incrementing counter for clients"
+ type: integer
+ example: "1"
+ credit_number_pattern:
+ description: "Allows customisation of the credit number pattern"
+ type: string
+ example: "{$year}-{$counter}"
+ credit_number_counter:
+ description: "The incrementing counter for credits"
+ type: integer
+ example: "1"
+ recurring_invoice_number_prefix:
+ description: "This string is prepended to the recurring invoice number"
+ type: string
+ example: R
+ reset_counter_frequency_id:
+ description: "CONSTANT which is used to apply the frequency which the counters are reset"
+ type: integer
+ example: "1"
+ reset_counter_date:
+ description: "The explicit date which is used to reset counters"
+ type: string
+ example: "2019-01-01"
+ counter_padding:
+ description: "Pads the counter with leading zeros"
+ type: integer
+ example: "1"
+ shared_invoice_quote_counter:
+ description: "Flags whether to share the counter for invoices and quotes"
+ type: boolean
+ example: true
+ update_products:
+ description: "Determines if client fields are updated from third party APIs"
+ type: boolean
+ example: true
+ convert_products:
+ description: ""
+ type: boolean
+ example: true
+ fill_products:
+ description: "Automatically fill products based on product_key"
+ type: boolean
+ example: true
+ invoice_terms:
+ description: "The default invoice terms"
+ type: string
+ example: "Invoice Terms are..."
+ quote_terms:
+ description: "The default quote terms"
+ type: string
+ example: "Quote Terms are..."
+ invoice_taxes:
+ description: "Taxes can be applied to the invoice"
+ type: number
+ example: "1"
+ invoice_design_id:
+ description: "The default design id (invoice, quote etc)"
+ type: string
+ example: "1"
+ quote_design_id:
+ description: "The default design id (invoice, quote etc)"
+ type: string
+ example: "1"
+ invoice_footer:
+ description: "The default invoice footer"
+ type: string
+ example: "1"
+ invoice_labels:
+ description: "JSON string of invoice labels"
+ type: string
+ example: "1"
+ tax_rate1:
+ description: "The tax rate (float)"
+ type: number
+ example: "10"
+ tax_name1:
+ description: "The tax name"
+ type: string
+ example: GST
+ tax_rate2:
+ description: "The tax rate (float)"
+ type: number
+ example: "10"
+ tax_name2:
+ description: "The tax name"
+ type: string
+ example: GST
+ tax_rate3:
+ description: "The tax rate (float)"
+ type: number
+ example: "10"
+ tax_name3:
+ description: "The tax name"
+ type: string
+ example: GST
+ payment_type_id:
+ description: "The default payment type id"
+ type: string
+ example: "1"
+ custom_fields:
+ description: "JSON string of custom fields"
+ type: string
+ example: "{}"
+ email_footer:
+ description: "The default email footer"
+ type: string
+ example: "A default email footer"
+ email_sending_method:
+ description: "The email driver to use to send email, options include default, gmail, client_postmark, client_mailgun, client_brevo, office365"
+ type: string
+ example: default
+ gmail_sending_user_id:
+ description: "The hashed_id of the user account to send email from"
+ type: string
+ example: F76sd34D
+ email_subject_invoice:
+ description: ""
+ type: string
+ example: "Your Invoice Subject"
+ email_subject_quote:
+ description: ""
+ type: string
+ example: "Your Quote Subject"
+ email_subject_payment:
+ description: ""
+ type: string
+ example: "Your Payment Subject"
+ email_template_invoice:
+ description: "The full template for invoice emails"
+ type: string
+ example: ""
+ email_template_quote:
+ description: "The full template for quote emails"
+ type: string
+ example: ""
+ email_template_payment:
+ description: "The full template for payment emails"
+ type: string
+ example: ""
+ email_subject_reminder1:
+ description: "Email subject for Reminder"
+ type: string
+ example: ""
+ email_subject_reminder2:
+ description: "Email subject for Reminder"
+ type: string
+ example: ""
+ email_subject_reminder3:
+ description: "Email subject for Reminder"
+ type: string
+ example: ""
+ email_subject_reminder_endless:
+ description: "Email subject for endless reminders"
+ type: string
+ example: ""
+ email_template_reminder1:
+ description: "The full template for Reminder 1"
+ type: string
+ example: ""
+ email_template_reminder2:
+ description: "The full template for Reminder 2"
+ type: string
+ example: ""
+ email_template_reminder3:
+ description: "The full template for Reminder 3"
+ type: string
+ example: ""
+ email_template_reminder_endless:
+ description: "The full template for enless reminders"
+ type: string
+ example: ""
+ enable_portal_password:
+ description: "Toggles whether a password is required to log into the client portal"
+ type: boolean
+ example: true
+ show_accept_invoice_terms:
+ description: "Toggles whether the terms dialogue is shown to the client"
+ type: boolean
+ example: true
+ show_accept_quote_terms:
+ description: "Toggles whether the terms dialogue is shown to the client"
+ type: boolean
+ example: true
+ require_invoice_signature:
+ description: "Toggles whether a invoice signature is required"
+ type: boolean
+ example: true
+ require_quote_signature:
+ description: "Toggles whether a quote signature is required"
+ type: boolean
+ example: true
+ name:
+ description: "The company name"
+ type: string
+ example: "Acme Co"
+ company_logo:
+ description: "The company logo file"
+ type: object
+ example: logo.png
+ website:
+ description: "The company website URL"
+ type: string
+ example: www.acme.com
+ address1:
+ description: "The company address line 1"
+ type: string
+ example: "Suite 888"
+ address2:
+ description: "The company address line 2"
+ type: string
+ example: "5 Jimbo Way"
+ city:
+ description: "The company city"
+ type: string
+ example: Sydney
+ state:
+ description: "The company state"
+ type: string
+ example: Florisa
+ postal_code:
+ description: "The company zip/postal code"
+ type: string
+ example: "90210"
+ phone:
+ description: "The company phone"
+ type: string
+ example: 555-213-3948
+ email:
+ description: "The company email"
+ type: string
+ example: joe@acme.co
+ country_id:
+ description: "The country ID"
+ type: string
+ example: "1"
+ vat_number:
+ description: "The company VAT/TAX ID number"
+ type: string
+ example: "32 120 377 720"
+ page_size:
+ description: "The default page size"
+ type: string
+ example: A4
+ font_size:
+ description: "The font size"
+ type: number
+ example: "9"
+ primary_font:
+ description: "The primary font"
+ type: string
+ example: roboto
+ secondary_font:
+ description: "The secondary font"
+ type: string
+ example: roboto
+ hide_paid_to_date:
+ description: "Flags whether to hide the paid to date field"
+ type: boolean
+ example: false
+ embed_documents:
+ description: "Toggled whether to embed documents in the PDF"
+ type: boolean
+ example: false
+ all_pages_header:
+ description: "The header for the PDF"
+ type: boolean
+ example: false
+ all_pages_footer:
+ description: "The footer for the PDF"
+ type: boolean
+ example: false
+ document_email_attachment:
+ description: "Toggles whether to attach documents in the email"
+ type: boolean
+ example: false
+ enable_client_portal_password:
+ description: "Toggles password protection of the client portal"
+ type: boolean
+ example: false
+ enable_email_markup:
+ description: "Toggles the use of markdown in emails"
+ type: boolean
+ example: false
+ enable_client_portal_dashboard:
+ description: "Toggles whether the client dashboard is shown in the client portal"
+ type: boolean
+ example: false
+ enable_client_portal:
+ description: "Toggles whether the entire client portal is displayed to the client, or only the context"
+ type: boolean
+ example: false
+ email_template_statement:
+ description: "The body of the email for statements"
+ type: string
+ example: "template matter"
+ email_subject_statement:
+ description: "The subject of the email for statements"
+ type: string
+ example: "subject matter"
+ signature_on_pdf:
+ description: "Toggles whether the signature (if available) is displayed on the PDF"
+ type: boolean
+ example: false
+ quote_footer:
+ description: "The default quote footer"
+ type: string
+ example: "the quote footer"
+ email_subject_custom1:
+ description: "Custom reminder template subject"
+ type: string
+ example: "Custom Subject 1"
+ email_subject_custom2:
+ description: "Custom reminder template subject"
+ type: string
+ example: "Custom Subject 2"
+ email_subject_custom3:
+ description: "Custom reminder template subject"
+ type: string
+ example: "Custom Subject 3"
+ email_template_custom1:
+ description: "Custom reminder template body"
+ type: string
+ example: ""
+ email_template_custom2:
+ description: "Custom reminder template body"
+ type: string
+ example: ""
+ email_template_custom3:
+ description: "Custom reminder template body"
+ type: string
+ example: ""
+ enable_reminder1:
+ description: "Toggles whether this reminder is enabled"
+ type: boolean
+ example: false
+ enable_reminder2:
+ description: "Toggles whether this reminder is enabled"
+ type: boolean
+ example: false
+ enable_reminder3:
+ description: "Toggles whether this reminder is enabled"
+ type: boolean
+ example: false
+ num_days_reminder1:
+ description: "The Reminder interval"
+ type: number
+ example: "9"
+ num_days_reminder2:
+ description: "The Reminder interval"
+ type: number
+ example: "9"
+ num_days_reminder3:
+ description: "The Reminder interval"
+ type: number
+ example: "9"
+ schedule_reminder1:
+ description: "(enum: after_invoice_date, before_due_date, after_due_date)"
+ type: string
+ example: after_invoice_date
+ schedule_reminder2:
+ description: "(enum: after_invoice_date, before_due_date, after_due_date)"
+ type: string
+ example: after_invoice_date
+ schedule_reminder3:
+ description: "(enum: after_invoice_date, before_due_date, after_due_date)"
+ type: string
+ example: after_invoice_date
+ late_fee_amount1:
+ description: "The late fee amount for reminder 1"
+ type: number
+ example: 10
+ late_fee_amount2:
+ description: "The late fee amount for reminder 2"
+ type: number
+ example: 20
+ late_fee_amount3:
+ description: "The late fee amount for reminder 2"
+ type: number
+ example: 100
+ endless_reminder_frequency_id:
+ description: "The frequency id of the endless reminder"
+ type: string
+ example: "1"
+ client_online_payment_notification:
+ description: "Determines if a client should receive the notification for a online payment"
+ type: boolean
+ example: false
+ client_manual_payment_notification:
+ description: "Determines if a client should receive the notification for a manually entered payment"
+ type: boolean
+ example: false
+ enable_e_invoice:
+ description: "Determines if e-invoicing is enabled"
+ type: boolean
+ example: false
+ default_expense_payment_type_id:
+ description: "The default payment type for expenses"
+ type: string
+ example: "0"
+ e_invoice_type:
+ description: "The e-invoice type"
+ type: string
+ example: "EN16931"
+ mailgun_endpoint:
+ description: "The mailgun endpoint - used to determine whether US or EU endpoints are used"
+ type: string
+ example: "api.mailgun.net or api.eu.mailgun.net"
+ client_initiated_payments:
+ description: "Determines if clients can initiate payments directly from the client portal"
+ type: boolean
+ example: false
+ client_initiated_payments_minimum:
+ description: "The minimum amount a client can pay"
+ type: number
+ example: 10
+ sync_invoice_quote_columns:
+ description: "Determines if invoice and quote columns are synced for the PDF rendering, or if they use their own columns"
+ type: boolean
+ example: false
+ show_task_item_description:
+ description: "Determines if the task item description is shown on the invoice"
+ type: boolean
+ example: false
+ allow_billable_task_items:
+ description: "Determines if task items can be marked as billable"
+ type: boolean
+ example: false
+ accept_client_input_quote_approval:
+ description: "Determines if clients can approve quotes and also pass through a PO Number reference"
+ type: boolean
+ example: false
+ custom_sending_email:
+ description: "When using Mailgun or Postmark, the FROM email address can be customized using this setting."
+ type: string
+ example: "bob@gmail.com"
+ show_paid_stamp:
+ description: "Determines if the PAID stamp is shown on the invoice"
+ type: boolean
+ example: false
+ show_shipping_address:
+ description: "Determines if the shipping address is shown on the invoice"
+ type: boolean
+ example: false
+ company_logo_size:
+ description: "The size of the company logo on the PDF - percentage value between 0 and 100"
+ type: number
+ example: 100
+ show_email_footer:
+ description: "Determines if the email footer is shown on emails"
+ type: boolean
+ example: false
+ email_alignment:
+ description: "The alignment of the email body text, options include left / center / right"
+ type: string
+ example: "left"
+ auto_bill_standard_invoices:
+ description: "Determines if standard invoices are automatically billed when they are created or due"
+ type: boolean
+ example: false
+ postmark_secret:
+ description: "The Postmark secret API key"
+ type: string
+ example: "123456"
+ mailgun_secret:
+ description: "The Mailgun secret API key"
+ type: string
+ example: "123456"
+ mailgun_domain:
+ description: "The Mailgun domain"
+ type: string
+ example: "sandbox123456.mailgun.org"
+ send_email_on_mark_paid:
+ description: "Determines if an email is sent when an invoice is marked as paid"
+ type: boolean
+ example: false
+ vendor_portal_enable_uploads:
+ description: "Determines if vendors can upload files to the portal"
+ type: boolean
+ example: false
+ besr_id:
+ description: "The BESR ID"
+ type: string
+ example: "123456"
+ qr_iban:
+ description: "The IBAN for the QR code"
+ type: string
+ example: "CH123456"
+ email_subject_purchase_order:
+ description: "The email subject for purchase orders"
+ type: string
+ example: "Purchase Order"
+ email_template_purchase_order:
+ description: "The email template for purchase orders"
+ type: string
+ example: "Please see attached your purchase order."
+ require_purchase_order_signature:
+ description: "Determines if a signature is required on purchase orders"
+ type: boolean
+ example: false
+ purchase_order_public_notes:
+ description: "The public notes for purchase orders"
+ type: string
+ example: "Please see attached your purchase order."
+ purchase_order_terms:
+ description: "The terms for purchase orders"
+ type: string
+ example: "Please see attached your purchase order."
+ purchase_order_footer:
+ description: "The footer for purchase orders"
+ type: string
+ example: "Please see attached your purchase order."
+ purchase_order_design_id:
+ description: "The design id for purchase orders"
+ type: string
+ example: "hd677df"
+ purchase_order_number_pattern:
+ description: "The pattern for purchase order numbers"
+ type: string
+ example: "PO-000000"
+ purchase_order_number_counter:
+ description: "The counter for purchase order numbers"
+ type: number
+ example: 1
+ page_numbering_alignment:
+ description: "The alignment for page numbering: options include left / center / right"
+ type: string
+ example: "left"
+ page_numbering:
+ description: "Determines if page numbering is enabled on Document PDFs"
+ type: boolean
+ example: false
+ auto_archive_invoice_cancelled:
+ description: "Determines if invoices are automatically archived when they are cancelled"
+ type: boolean
+ example: false
+ email_from_name:
+ description: "The FROM name for emails when using Custom emailers"
+ type: string
+ example: "Bob Smith"
+ show_all_tasks_client_portal:
+ description: "Determines if all tasks are shown on the client portal"
+ type: boolean
+ example: false
+ entity_send_time:
+ description: "The time that emails are sent. The time is localized to the clients locale, integer values from 1 - 24"
+ type: integer
+ example: 9
+ shared_invoice_credit_counter:
+ description: "Determines if the invoice and credit counter are shared"
+ type: boolean
+ example: false
+ reply_to_name:
+ description: "The reply to name for emails"
+ type: string
+ example: "Bob Smith"
+ hide_empty_columns_on_pdf:
+ description: "Determines if empty columns are hidden on PDFs"
+ type: boolean
+ example: false
+ enable_reminder_endless:
+ description: "Determines if endless reminders are enabled"
+ type: boolean
+ example: false
+ use_credits_payment:
+ description: "Determines if credits can be used as a payment method"
+ type: boolean
+ example: false
+ recurring_invoice_number_pattern:
+ description: "The pattern for recurring invoice numbers"
+ type: string
+ example: "R-000000"
+ recurring_invoice_number_counter:
+ description: "The counter for recurring invoice numbers"
+ type: number
+ example: 1
+ client_portal_under_payment_minimum:
+ description: "The minimum payment payment"
+ type: number
+ example: 10
+ auto_bill_date:
+ description: "Determines when the invoices are auto billed, options are on_send_date (when the invoice is sent) or on_due_date (when the invoice is due))"
+ type: string
+ example: "on_send_date"
+ primary_color:
+ description: "The primary color for the client portal / document highlights"
+ type: string
+ example: "#ffffff"
+ secondary_color:
+ description: "The secondary color for the client portal / document highlights"
+ type: string
+ example: "#ffffff"
+ client_portal_allow_under_payment:
+ description: "Determines if clients can pay invoices under the invoice amount due"
+ type: boolean
+ example: false
+ client_portal_allow_over_payment:
+ description: "Determines if clients can pay invoices over the invoice amount"
+ type: boolean
+ example: false
+ auto_bill:
+ description: "Determines how autobilling is applied for recurring invoices. off (no auto billed), always (always auto bill), optin (The user must opt in to auto billing), optout (The user must opt out of auto billing"
+ type: string
+ example: "off"
+ client_portal_terms:
+ description: "The terms which are displayed on the client portal"
+ type: string
+ example: "Please see attached your invoice."
+ client_portal_privacy_policy:
+ description: "The privacy policy which is displayed on the client portal"
+ type: string
+ example: "These are the terms of use for using the client portal."
+ client_can_register:
+ description: "Determines if clients can register on the client portal"
+ type: boolean
+ example: false
+ portal_design_id:
+ description: "The design id for the client portal"
+ type: string
+ example: "hd677df"
+ late_fee_endless_percent:
+ description: "The late fee percentage for endless late fees"
+ type: number
+ example: 10
+ late_fee_endless_amount:
+ description: "The late fee amount for endless late fees"
+ type: number
+ example: 10
+ auto_email_invoice:
+ description: "Determines if invoices are automatically emailed when they are created"
+ type: boolean
+ example: false
+ email_signature:
+ description: "The email signature for emails"
+ type: string
+ example: "Bob Smith"
+ classification:
+ description: "The classification for the company"
+ type: string
+ example: "individual"
+ type: object
diff --git a/openapi/components/schemas/company_user.yaml b/openapi/components/schemas/company_user.yaml
index 1ed7c821e712..82495e5d95be 100644
--- a/openapi/components/schemas/company_user.yaml
+++ b/openapi/components/schemas/company_user.yaml
@@ -40,7 +40,53 @@
company:
$ref: '#/components/schemas/Company'
user:
- $ref: '#/components/schemas/User'
+ $ref: '#/components/schemas/UserRef'
+ token:
+ $ref: '#/components/schemas/CompanyToken'
+ type: object
+ CompanyUserRef:
+ properties:
+ permissions:
+ description: 'The user permissionsfor this company in a comma separated list'
+ type: string
+ example: 'create_invoice,create_client,view_client'
+ settings:
+ description: 'Settings that are used for the flutter applications to store user preferences / metadata'
+ type: object
+ readOnly: true
+ react_settings:
+ description: 'Dedicated settings object for the react web application'
+ type: object
+ readOnly: true
+ is_owner:
+ description: 'Determines whether the user owns this company'
+ type: boolean
+ example: true
+ readOnly: true
+ is_admin:
+ description: 'Determines whether the user is the admin of this company'
+ type: boolean
+ example: true
+ readOnly: true
+ is_locked:
+ description: 'Determines whether the users access to this company has been locked'
+ type: boolean
+ example: true
+ readOnly: true
+ updated_at:
+ description: 'The last time the record was modified, format Unix Timestamp'
+ type: integer
+ example: '1231232312321'
+ deleted_at:
+ description: 'Timestamp when the user was archived, format Unix Timestamp'
+ type: integer
+ example: '12312312321'
+ account:
+ $ref: '#/components/schemas/Account'
+ company:
+ $ref: '#/components/schemas/Company'
+ user:
+ $ref: '#/components/schemas/UserRef'
token:
$ref: '#/components/schemas/CompanyToken'
type: object
\ No newline at end of file
diff --git a/openapi/components/schemas/user.yaml b/openapi/components/schemas/user.yaml
index a73cdce1f8a8..a62d81fcbc4b 100644
--- a/openapi/components/schemas/user.yaml
+++ b/openapi/components/schemas/user.yaml
@@ -100,5 +100,107 @@
example: '123456'
readOnly: true
company_user:
- $ref: '#/components/schemas/CompanyUser'
+ $ref: '#/components/schemas/CompanyUserRef'
+ type: object
+ UserRef:
+ properties:
+ id:
+ description: 'The hashed id of the user'
+ type: string
+ example: Opnel5aKBz
+ readOnly: true
+ first_name:
+ description: 'The first name of the user'
+ type: string
+ example: Brad
+ last_name:
+ description: 'The last name of the user'
+ type: string
+ example: Pitt
+ email:
+ description: 'The users email address'
+ type: string
+ example: brad@pitt.com
+ phone:
+ description: 'The users phone number'
+ type: string
+ example: 555-1233-23232
+ signature:
+ description: 'The users sign off signature'
+ type: string
+ example: 'Have a nice day!'
+ avatar:
+ description: 'The users avatar'
+ type: string
+ example: 'https://url.to.your/avatar.png'
+ accepted_terms_version:
+ description: 'The version of the invoice ninja terms that has been accepted by the user'
+ type: string
+ example: 1.0.1
+ readOnly: true
+ oauth_user_id:
+ description: 'The provider id of the oauth entity'
+ type: string
+ example: jkhasdf789as6f675sdf768sdfs
+ readOnly: true
+ oauth_provider_id:
+ description: 'The oauth entity id'
+ type: string
+ example: google
+ readOnly: true
+ language_id:
+ description: 'The language id of the user'
+ type: string
+ example: 1
+ verified_phone_number:
+ description: 'Boolean flag if the user has their phone verified. Required to settings up 2FA'
+ type: boolean
+ example: true
+ readOnly: true
+ sms_verification_code:
+ description: 'The sms verification code for the user. Required to settings up 2FA'
+ type: string
+ example: '123456'
+ readOnly: true
+ oauth_user_token_expiry:
+ description: 'The expiry date of the oauth token'
+ type: string
+ example: '2022-10-10'
+ readOnly: true
+ has_password:
+ description: 'Boolean flag determining if the user has a password'
+ type: boolean
+ example: true
+ readOnly: true
+ last_confirmed_email_address:
+ description: 'The last confirmed email address of the user'
+ type: string
+ example: 'bob@gmail.com'
+ readOnly: true
+ custom_value1:
+ description: 'A custom value'
+ type: string
+ example: 'Custom value 1'
+ custom_value2:
+ description: 'A custom value'
+ type: string
+ example: '$1000'
+ custom_value3:
+ description: 'A custom value'
+ type: string
+ example: 'Custom value 3'
+ custom_value4:
+ description: 'A custom value'
+ type: string
+ example: 'Custom value 4'
+ is_deleted:
+ description: 'Boolean flag determining if the user has been deleted'
+ type: boolean
+ example: true
+ readOnly: true
+ google_2fa_secret:
+ description: 'The google 2fa secret for the user'
+ type: string
+ example: '123456'
+ readOnly: true
type: object
\ No newline at end of file
diff --git a/openapi/info.yaml b/openapi/info.yaml
index 151ecc26f4c4..00a0c955c3bc 100644
--- a/openapi/info.yaml
+++ b/openapi/info.yaml
@@ -3,22 +3,88 @@ info:
title: 'Invoice Ninja API Reference.'
description: |
---
-
-
- The Invoice Ninja API is organized around REST and returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs.
-
-
+ ## Introduction
+ Welcome to the Invoice Ninja API documentation, your comprehensive guide to integrating Invoice Ninja's powerful features into your applications. Whether you're building a custom client, automating workflows, or integrating with other systems, our API provides the tools you need to streamline your invoicing and billing processes.
+ ## What is Invoice Ninja?
+ Invoice Ninja is a robust source-available platform designed to simplify invoicing, billing, and payment management for freelancers, small businesses, and enterprises alike. With a user-friendly interface, customizable templates, and a suite of powerful features, Invoice Ninja empowers businesses to create professional invoices, track expenses, manage clients, and get paid faster.
+
+ ## Why use the Invoice Ninja API?
+ The Invoice Ninja API allows developers to extend the functionality of Invoice Ninja by programmatically accessing and manipulating data within their Invoice Ninja accounts. With the API, you can automate repetitive tasks, integrate with third-party services, and build custom solutions tailored to your specific business needs.
+
+ ## Getting Started
+ To get started with the Invoice Ninja API, you'll need an active Invoice Ninja account (or your own self hosted installation) and API credentials. If you haven't already done so, sign up for an account at Invoice Ninja and generate your API keys from the settings section.
+
+ Once you have your API credentials, you can start exploring the API endpoints, authentication methods, request and response formats, and more using the documentation provided here.
+
+ ## Explore the Documentation
+ This documentation is organized into sections to help you navigate and understand the various aspects of the Invoice Ninja API:
+
+ Authentication: Learn how to authenticate your requests to the API using API tokens.
+ Endpoints: Explore the available API endpoints for managing invoices, clients, payments, expenses, and more.
+ Request and Response Formats: Understand the structure of API requests and responses, including parameters, headers, and payloads.
+ Error Handling: Learn about error codes, status messages, and best practices for handling errors gracefully.
+ Code Examples: Find code examples and tutorials to help you get started with integrating the Invoice Ninja API into your applications.
+
+ ## Need Help?
+
+ If you have any questions, encounter any issues, or need assistance with using the Invoice Ninja API, don't hesitate to reach out to our support team or join our community forums. We're here to help you succeed with Invoice Ninja and make the most of our API.
+
+ Let's start building together!
+
+ ## Endpoints
+
+
+
Production: https://invoicing.co
+
Demo: https://demo.invoiceninja.com
+
+
+ ## Client Libraries
+
+ PHP SDK can be found [here](https://github.com/invoiceninja/sdk-php)
+
+ ## Authentication:
+
+ Invoice Ninja uses API tokens to authenticate requests. You can view and manage your API keys in Settings > Account Management > Integrations > API tokens
+
+ API requests must be made over HTTPS. Calls made to HTTP will fail.
+
+ ## Errors:
+
+ Invoice Ninja uses standard HTTP response codes to indicate the success or failure of a request. below is a table of standard status codes and responses
+
+ | Status Code | Explanation |
+ |-------------|-----------------------------------------------------------------------------|
+ | 200 | OK: The request has succeeded. The information returned with the response is dependent on the method used in the request. |
+ | 301 | Moved Permanently: This and all future requests should be directed to the given URI. |
+ | 303 | See Other: The response to the request can be found under another URI using the GET method. |
+ | 400 | Bad Request: The server cannot or will not process the request due to an apparent client error. |
+ | 401 | Unauthorized: Similar to 403 Forbidden, but specifically for use when authentication is required and has failed or has not yet been provided. |
+ | 403 | Forbidden: The request was valid, but the server is refusing action. |
+ | 404 | Not Found: The requested resource could not be found but may be available in the future. |
+ | 405 | Method Not Allowed: A request method is not supported for the requested resource. |
+ | 409 | Conflict: Indicates that the request could not be processed because of conflict in the request. |
+ | 422 | Unprocessable Entity: The request was well-formed but was unable to be followed due to semantic errors. |
+ | 429 | Too Many Requests: The user has sent too many requests in a given amount of time ("rate limiting"). |
+ | 500 | Internal Server Error: A generic error message, given when an unexpected condition was encountered and no more specific message is suitable. |
+
+ ## Pagination
+
+ When using index routes to retrieve lists of data, by default we limit the number of records returned to 20. You can using standard pagination to paginate results, ie:
termsOfService: 'https://invoiceninja.github.io/docs/legal/terms_of_service/#page-content'
contact:
email: contact@invoiceninja.com
+ name: Invoice Ninja Support
+ url: 'https://www.invoiceninja.com'
license:
name: 'Elastic License'
url: 'https://www.elastic.co/licensing/elastic-license'
- version: 5.8.34
+ version: 5.9.2
servers:
- -
- url: 'https://demo.invoiceninja.com'
- description: |
- ## Demo API Server InvoiceNinja.
- You can use the demo API key `TOKEN` to test the endpoints from within this API spec
\ No newline at end of file
+ - url: 'https://demo.invoiceninja.com'
+ description: |
+ ## Demo API endpoint
+ You can use the demo API key `TOKEN` to test the endpoints from within this API spec
+ - url: 'https://invoicing.co'
+ description: |
+ ## Production API endpoint
\ No newline at end of file
diff --git a/openapi/paths.yaml b/openapi/paths.yaml
index 1b74e64a9ec4..1ea52ab550b4 100644
--- a/openapi/paths.yaml
+++ b/openapi/paths.yaml
@@ -116,12 +116,10 @@ paths:
description: "The users email address."
type: string
example: "demo@invoiceninja.com"
- required: true
password:
description: "The user password. Must meet minimum criteria ~ > 6 characters"
type: string
example: "Password0"
- required: true
one_time_password:
description: "The one time password if 2FA is enabled"
type: string
diff --git a/openapi/paths/clients.yaml b/openapi/paths/clients.yaml
index a511b005effc..c71bad405308 100644
--- a/openapi/paths/clients.yaml
+++ b/openapi/paths/clients.yaml
@@ -3,6 +3,17 @@
tags:
- clients
summary: 'List clients'
+ x-code-samples:
+ - lang: go
+ label: php
+ source: |
+ $ninja = new InvoiceNinja("your_token");
+ $invoices = $ninja->clients->all();
+ x-custom-element:
+ type: markdown
+ value: |
+ ### Custom Response Description
+ This is a custom description for the response returned by the `/example` endpoint.
description: |
When retrieving a list of clients you can also chain query parameters in order to filter the dataset that is returned. For example, you can send a request to the following URL to retrieve clients that have a balance greater than 1000:\
diff --git a/package-lock.json b/package-lock.json
index 3c873758a1f7..8c337b628e29 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,5 +1,5 @@
{
- "name": "@invoiceninja/invoiceninja",
+ "name": "invoiceninja",
"lockfileVersion": 2,
"requires": true,
"packages": {
diff --git a/public/build/assets/app-c7c5fad4.css b/public/build/assets/app-f3b33400.css
similarity index 79%
rename from public/build/assets/app-c7c5fad4.css
rename to public/build/assets/app-f3b33400.css
index 1a72fc29a287..2c37a323fc86 100644
--- a/public/build/assets/app-c7c5fad4.css
+++ b/public/build/assets/app-f3b33400.css
@@ -1 +1 @@
-*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Open Sans,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}[type=text],input:where(:not([type])),[type=email],[type=url],[type=password],[type=number],[type=date],[type=datetime-local],[type=month],[type=search],[type=tel],[type=time],[type=week],[multiple],textarea,select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow: 0 0 #0000}[type=text]:focus,input:where(:not([type])):focus,[type=email]:focus,[type=url]:focus,[type=password]:focus,[type=number]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=month]:focus,[type=search]:focus,[type=tel]:focus,[type=time]:focus,[type=week]:focus,[multiple]:focus,textarea:focus,select:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#2563eb}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple],[size]:where(select:not([size="1"])){background-image:initial;background-position:initial;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#2563eb;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow: 0 0 #0000}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 2px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}[type=checkbox]:checked,[type=radio]:checked{border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}[type=checkbox]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")}@media (forced-colors: active){[type=checkbox]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=radio]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e")}@media (forced-colors: active){[type=radio]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:checked:hover,[type=checkbox]:checked:focus,[type=radio]:checked:hover,[type=radio]:checked:focus{border-color:transparent;background-color:currentColor}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}@media (forced-colors: active){[type=checkbox]:indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:indeterminate:hover,[type=checkbox]:indeterminate:focus{border-color:transparent;background-color:currentColor}[type=file]{background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.form-input,.form-textarea,.form-select,.form-multiselect{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow: 0 0 #0000}.form-input:focus,.form-textarea:focus,.form-select:focus,.form-multiselect:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#2563eb}.form-select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}.form-select:where([size]:not([size="1"])){background-image:initial;background-position:initial;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}.form-checkbox,.form-radio{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#2563eb;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow: 0 0 #0000}.form-checkbox{border-radius:0}.form-radio{border-radius:100%}.form-checkbox:focus,.form-radio:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 2px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.form-checkbox:checked,.form-radio:checked{border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}.form-checkbox:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")}@media (forced-colors: active){.form-checkbox:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}.form-radio:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e")}@media (forced-colors: active){.form-radio:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}.form-checkbox:checked:hover,.form-checkbox:checked:focus,.form-radio:checked:hover,.form-radio:checked:focus{border-color:transparent;background-color:currentColor}.form-checkbox:indeterminate{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}@media (forced-colors: active){.form-checkbox:indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}.form-checkbox:indeterminate:hover,.form-checkbox:indeterminate:focus{border-color:transparent;background-color:currentColor}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-left-width:.25rem;border-left-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-left:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%),0 3px 0 rgb(var(--tw-prose-kbd-shadows) / 10%);font-size:.875em;border-radius:.3125rem;padding:.1875em .375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding:.8571429em 1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;text-align:left;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-right:.5714286em;padding-bottom:.5714286em;padding-left:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body: #374151;--tw-prose-headings: #111827;--tw-prose-lead: #4b5563;--tw-prose-links: #111827;--tw-prose-bold: #111827;--tw-prose-counters: #6b7280;--tw-prose-bullets: #d1d5db;--tw-prose-hr: #e5e7eb;--tw-prose-quotes: #111827;--tw-prose-quote-borders: #e5e7eb;--tw-prose-captions: #6b7280;--tw-prose-kbd: #111827;--tw-prose-kbd-shadows: 17 24 39;--tw-prose-code: #111827;--tw-prose-pre-code: #e5e7eb;--tw-prose-pre-bg: #1f2937;--tw-prose-th-borders: #d1d5db;--tw-prose-td-borders: #e5e7eb;--tw-prose-invert-body: #d1d5db;--tw-prose-invert-headings: #fff;--tw-prose-invert-lead: #9ca3af;--tw-prose-invert-links: #fff;--tw-prose-invert-bold: #fff;--tw-prose-invert-counters: #9ca3af;--tw-prose-invert-bullets: #4b5563;--tw-prose-invert-hr: #374151;--tw-prose-invert-quotes: #f3f4f6;--tw-prose-invert-quote-borders: #374151;--tw-prose-invert-captions: #9ca3af;--tw-prose-invert-kbd: #fff;--tw-prose-invert-kbd-shadows: 255 255 255;--tw-prose-invert-code: #fff;--tw-prose-invert-pre-code: #d1d5db;--tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);--tw-prose-invert-th-borders: #4b5563;--tw-prose-invert-td-borders: #374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-left:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-left:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>*:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>*:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>*:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>*:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-left:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-left:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-right:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-left:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-right:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.button{border-radius:.25rem;padding:.75rem 1rem;font-size:.875rem;line-height:1rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}button:disabled{cursor:not-allowed;opacity:.5}.button-primary{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.button-primary:hover{font-weight:600}.button-block{display:block;width:100%}.button-danger{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.button-danger:hover{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity))}.button-secondary{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.button-secondary:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity))}.button-link{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity))}.button-link:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity));text-decoration-line:underline}.button-link:focus{text-decoration-line:underline;outline:2px solid transparent;outline-offset:2px}.validation{margin-top:.5rem;margin-bottom:.25rem;border-left-width:2px;--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity));padding:.25rem .75rem}.validation-fail{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity));font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity))}.validation-pass{--tw-border-opacity: 1;border-color:rgb(16 185 129 / var(--tw-border-opacity));font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity))}.input{margin-top:.5rem;align-items:center;border-radius:.25rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem}.input:focus{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity));outline:2px solid transparent;outline-offset:2px}.input-label{font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity))}.input-slim{padding-top:.5rem;padding-bottom:.5rem}.form-checkbox{cursor:pointer;border-radius:.25rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity))}.form-select{border-width:1px;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity))}.alert{margin-top:.5rem;margin-bottom:.25rem;border-left-width:2px;--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity));padding:.75rem 1rem;font-size:.875rem;line-height:1.25rem}.alert-success{--tw-border-opacity: 1;border-color:rgb(16 185 129 / var(--tw-border-opacity))}.alert-failure{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity))}.badge{display:inline-flex;align-items:center;border-radius:9999px;padding:.125rem .625rem;font-size:.75rem;font-weight:500;line-height:1rem}.badge-light{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity));--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity))}.badge-primary{--tw-bg-opacity: 1;background-color:rgb(191 219 254 / var(--tw-bg-opacity));--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity))}.badge-danger{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity));--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity))}.badge-success{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity));--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity))}.badge-secondary{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity));--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity))}.badge-warning{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity));--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity))}.badge-info{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity));--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity))}@media (min-width: 640px){.dataTables_length{margin-top:1.25rem!important;margin-bottom:1.25rem!important}}@media (min-width: 1024px){.dataTables_length{margin-top:1rem!important;margin-bottom:1rem!important}}.dataTables_length select{margin-left:.5rem!important;margin-right:.5rem!important;--tw-bg-opacity: 1 !important;background-color:rgb(255 255 255 / var(--tw-bg-opacity))!important;margin-top:.5rem;align-items:center;border-radius:.25rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem}.dataTables_length select:focus{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity));outline:2px solid transparent;outline-offset:2px}.dataTables_filter{margin-bottom:1rem}.dataTables_filter input{margin-top:.5rem;align-items:center;border-radius:.25rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem}.dataTables_filter input:focus{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity));outline:2px solid transparent;outline-offset:2px}@media (min-width: 1024px){.dataTables_filter{margin-top:-3rem!important}}.dataTables_paginate{padding-bottom:1.5rem!important;padding-top:.5rem!important}.dataTables_paginate .paginate_button{margin-right:.25rem!important;cursor:pointer!important;border-width:1px!important;--tw-border-opacity: 1 !important;border-color:rgb(209 213 219 / var(--tw-border-opacity))!important;--tw-bg-opacity: 1 !important;background-color:rgb(255 255 255 / var(--tw-bg-opacity))!important;font-weight:500!important;--tw-text-opacity: 1 !important;color:rgb(55 65 81 / var(--tw-text-opacity))!important;border-radius:.25rem;padding:.75rem 1rem;font-size:.875rem;line-height:1rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dataTables_paginate .current{--tw-bg-opacity: 1 !important;background-color:rgb(37 99 235 / var(--tw-bg-opacity))!important;--tw-text-opacity: 1 !important;color:rgb(255 255 255 / var(--tw-text-opacity))!important}.dataTables_info{font-size:.875rem!important;line-height:1.25rem!important}.dataTables_empty{padding-top:1rem!important;padding-bottom:1rem!important}.pagination{display:flex!important;align-items:center!important}.pagination .page-link{margin-top:-1px!important;display:inline-flex!important;cursor:pointer!important;align-items:center!important;border-top-width:2px!important;border-color:transparent!important;padding-left:1rem!important;padding-right:1rem!important;padding-top:1rem!important;font-size:.875rem!important;font-weight:500!important;line-height:1.25rem!important;--tw-text-opacity: 1 !important;color:rgb(107 114 128 / var(--tw-text-opacity))!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter!important;transition-duration:.15s!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.pagination .page-link:hover{--tw-border-opacity: 1 !important;border-color:rgb(209 213 219 / var(--tw-border-opacity))!important;--tw-text-opacity: 1 !important;color:rgb(55 65 81 / var(--tw-text-opacity))!important}.pagination .page-link:focus{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity));--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity));outline:2px solid transparent;outline-offset:2px}.pagination .active>span{--tw-border-opacity: 1 !important;border-color:rgb(37 99 235 / var(--tw-border-opacity))!important;--tw-text-opacity: 1 !important;color:rgb(37 99 235 / var(--tw-text-opacity))!important}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.left-0{left:0}.left-1{left:.25rem}.right-0{right:0}.top-0{top:0}.top-1{top:.25rem}.z-0{z-index:0}.z-10{z-index:10}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.col-auto{grid-column:auto}.col-span-1{grid-column:span 1 / span 1}.col-span-12{grid-column:span 12 / span 12}.col-span-2{grid-column:span 2 / span 2}.col-span-3{grid-column:span 3 / span 3}.col-span-4{grid-column:span 4 / span 4}.col-span-6{grid-column:span 6 / span 6}.col-span-8{grid-column:span 8 / span 8}.float-right{float:right}.m-0{margin:0}.m-auto{margin:auto}.-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.mx-\[22px\]{margin-left:22px;margin-right:22px}.mx-\[40px\]{margin-left:40px;margin-right:40px}.mx-\[auto\],.mx-auto{margin-left:auto;margin-right:auto}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.-ml-1{margin-left:-.25rem}.-ml-4{margin-left:-1rem}.-ml-px{margin-left:-1px}.-mr-1{margin-right:-.25rem}.-mr-14{margin-right:-3.5rem}.-mt-4{margin-top:-1rem}.-mt-6{margin-top:-1.5rem}.mb-0{margin-bottom:0}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.mb-\[10px\]{margin-bottom:10px}.mb-\[11px\]{margin-bottom:11px}.mb-\[20px\]{margin-bottom:20px}.mb-\[25px\]{margin-bottom:25px}.mb-\[26px\]{margin-bottom:26px}.mb-\[36px\]{margin-bottom:36px}.mb-\[40px\]{margin-bottom:40px}.mb-\[5px\]{margin-bottom:5px}.ml-0{margin-left:0}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-5{margin-left:1.25rem}.ml-\[10px\]{margin-left:10px}.mr-0{margin-right:0}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mr-4{margin-right:1rem}.mr-5{margin-right:1.25rem}.mt-0{margin-top:0}.mt-1{margin-top:.25rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-20{margin-top:5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-\[30px\]{margin-top:30px}.mt-\[50px\]{margin-top:50px}.mt-\[auto\]{margin-top:auto}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-0{height:0px}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-24{height:6rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-8{height:2rem}.h-\[40px\]{height:40px}.h-auto{height:auto}.h-fit{height:-moz-fit-content;height:fit-content}.h-full{height:100%}.h-screen{height:100vh}.min-h-\[450px\]{min-height:450px}.min-h-screen{min-height:100vh}.w-0{width:0px}.w-1{width:.25rem}.w-1\/2{width:50%}.w-1\/6{width:16.666667%}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-24{width:6rem}.w-3\/4{width:75%}.w-4{width:1rem}.w-4\/5{width:80%}.w-4\/6{width:66.666667%}.w-48{width:12rem}.w-5{width:1.25rem}.w-5\/6{width:83.333333%}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-80{width:20rem}.w-\[100\%\]{width:100%}.w-\[87px\]{width:87px}.w-auto{width:auto}.w-full{width:100%}.w-screen{width:100vw}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-\[212px\]{max-width:212px}.max-w-\[450px\]{max-width:450px}.max-w-\[625px\]{max-width:625px}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.flex-grow,.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-1\/2{flex-basis:50%}.basis-full{flex-basis:100%}.table-auto{table-layout:auto}.border-collapse{border-collapse:collapse}.origin-top-right{transform-origin:top right}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-4{--tw-translate-y: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.place-content-end{place-content:end}.place-items-center{place-items:center}.content-center{align-content:center}.content-start{align-content:flex-start}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-stretch{justify-content:stretch}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-\[13px\]{gap:13px}.gap-\[44px\]{gap:44px}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-y-\[20px\]{row-gap:20px}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-y-scroll{overflow-y:scroll}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.overflow-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-\[10px\]{border-radius:10px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-4{border-width:4px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-t-2{border-top-width:2px}.border-t-4{border-top-width:4px}.border-t-\[0px\]{border-top-width:0px}.border-t-\[10px\]{border-top-width:10px}.border-t-\[1px\]{border-top-width:1px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-\[\#E5E7EB\]{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity))}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity))}.border-emerald-500{--tw-border-opacity: 1;border-color:rgb(16 185 129 / var(--tw-border-opacity))}.border-fuchsia-600{--tw-border-opacity: 1;border-color:rgb(192 38 211 / var(--tw-border-opacity))}.border-gray-100{--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity))}.border-gray-500{--tw-border-opacity: 1;border-color:rgb(107 114 128 / var(--tw-border-opacity))}.border-gray-600{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity))}.border-red-300{--tw-border-opacity: 1;border-color:rgb(252 165 165 / var(--tw-border-opacity))}.border-red-400{--tw-border-opacity: 1;border-color:rgb(248 113 113 / var(--tw-border-opacity))}.border-red-900{--tw-border-opacity: 1;border-color:rgb(127 29 29 / var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-opacity-50{--tw-border-opacity: .5}.bg-\[\#F2F9FE\]{--tw-bg-opacity: 1;background-color:rgb(242 249 254 / var(--tw-bg-opacity))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity))}.bg-blue-700{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity))}.bg-emerald-600{--tw-bg-opacity: 1;background-color:rgb(5 150 105 / var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity))}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.bg-opacity-100{--tw-bg-opacity: 1}.bg-clip-padding{background-clip:padding-box}.fill-current{fill:currentColor}.object-cover{-o-object-fit:cover;object-fit:cover}.object-scale-down{-o-object-fit:scale-down;object-fit:scale-down}.object-center{-o-object-position:center;object-position:center}.p-1{padding:.25rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-8{padding:2rem}.p-\[12px\]{padding:12px}.p-\[20px\]{padding:20px}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-12{padding-left:3rem;padding-right:3rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-\[12px\]{padding-left:12px;padding-right:12px}.px-\[20px\]{padding-left:20px;padding-right:20px}.px-\[22px\]{padding-left:22px;padding-right:22px}.py-0{padding-top:0;padding-bottom:0}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-\[33px\]{padding-top:33px;padding-bottom:33px}.py-\[36px\]{padding-top:36px;padding-bottom:36px}.py-\[9\.5px\]{padding-top:9.5px;padding-bottom:9.5px}.pb-10{padding-bottom:2.5rem}.pb-2{padding-bottom:.5rem}.pb-20{padding-bottom:5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pb-\[20px\]{padding-bottom:20px}.pb-\[56px\]{padding-bottom:56px}.pb-\[58px\]{padding-bottom:58px}.pl-0{padding-left:0}.pl-1{padding-left:.25rem}.pl-1\.5{padding-left:.375rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-\[18px\]{padding-left:18px}.pr-10{padding-right:2.5rem}.pr-2{padding-right:.5rem}.pr-4{padding-right:1rem}.pr-\[18px\]{padding-right:18px}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.pt-\[20px\]{padding-top:20px}.pt-\[29px\]{padding-top:29px}.pt-\[35px\]{padding-top:35px}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.font-\[\'Open_Sans\'\]{font-family:Open Sans}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-5xl{font-size:3rem;line-height:1}.text-\[12px\]{font-size:12px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[16px\]{font-size:16px}.text-\[22px\]{font-size:22px}.text-\[24px\]{font-size:24px}.text-\[35px\]{font-size:35px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-\[16px\]{font-weight:16px}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-9{line-height:2.25rem}.leading-\[1\.2rem\]{line-height:1.2rem}.leading-\[1\.35em\]{line-height:1.35em}.leading-\[1\.36em\]{line-height:1.36em}.leading-\[1\.375em\]{line-height:1.375em}.leading-\[1\.3em\]{line-height:1.3em}.leading-\[1\.5em\]{line-height:1.5em}.leading-\[1\.75em\]{line-height:1.75em}.leading-normal{line-height:1.5}.leading-tight{line-height:1.25}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-\[\#212529\]{--tw-text-opacity: 1;color:rgb(33 37 41 / var(--tw-text-opacity))}.text-\[\#6C727F\]{--tw-text-opacity: 1;color:rgb(108 114 127 / var(--tw-text-opacity))}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity))}.text-indigo-600{--tw-text-opacity: 1;color:rgb(79 70 229 / var(--tw-text-opacity))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity))}.text-red-900{--tw-text-opacity: 1;color:rgb(127 29 29 / var(--tw-text-opacity))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-75{opacity:.75}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-black{--tw-ring-opacity: 1;--tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity))}.ring-opacity-5{--tw-ring-opacity: .05}.grayscale{--tw-grayscale: grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.invert{--tw-invert: invert(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{transition-timing-function:linear}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.placeholder\:text-gray-500::-moz-placeholder{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}.placeholder\:text-gray-500::placeholder{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:left-\[8px\]:after{content:var(--tw-content);left:8px}.after\:top-\[5px\]:after{content:var(--tw-content);top:5px}.after\:h-\[30px\]:after{content:var(--tw-content);height:30px}.after\:w-\[30px\]:after{content:var(--tw-content);width:30px}.after\:rounded-full:after{content:var(--tw-content);border-radius:9999px}.after\:bg-white:after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.after\:transition-all:after{content:var(--tw-content);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.after\:content-\[\'\'\]:after{--tw-content: "";content:var(--tw-content)}.focus-within\:z-10:focus-within{z-index:10}.hover\:list-disc:hover{list-style-type:disc}.hover\:border-blue-600:hover{--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity))}.hover\:border-gray-600:hover{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity))}.hover\:border-gray-800:hover{--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity))}.hover\:border-transparent:hover{border-color:transparent}.hover\:bg-blue-500:hover{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity))}.hover\:bg-blue-600:hover{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.hover\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity))}.hover\:bg-red-900:hover{--tw-bg-opacity: 1;background-color:rgb(127 29 29 / var(--tw-bg-opacity))}.hover\:font-semibold:hover{font-weight:600}.hover\:text-blue-600:hover{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity))}.hover\:text-gray-300:hover{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity))}.hover\:text-gray-700:hover{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity))}.hover\:text-gray-800:hover{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity))}.hover\:text-gray-900:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity))}.hover\:text-indigo-900:hover{--tw-text-opacity: 1;color:rgb(49 46 129 / var(--tw-text-opacity))}.hover\:text-red-500:hover{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-2xl:hover{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-lg:hover{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-blue-300:focus{--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity))}.focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity))}.focus\:border-fuchsia-300:focus{--tw-border-opacity: 1;border-color:rgb(240 171 252 / var(--tw-border-opacity))}.focus\:border-indigo-500:focus{--tw-border-opacity: 1;border-color:rgb(99 102 241 / var(--tw-border-opacity))}.focus\:border-red-500:focus{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity))}.focus\:bg-gray-100:focus{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.focus\:bg-gray-600:focus{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity))}.focus\:bg-white:focus{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.focus\:font-semibold:focus{font-weight:600}.focus\:text-gray-500:focus{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}.focus\:text-gray-600:focus{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity))}.focus\:text-gray-900:focus{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity))}.focus\:underline:focus{text-decoration-line:underline}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity))}.focus\:ring-indigo-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity))}.focus\:ring-indigo-600:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(79 70 229 / var(--tw-ring-opacity))}.focus\:ring-red-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity))}.focus\:ring-opacity-50:focus{--tw-ring-opacity: .5}.active\:bg-gray-50:active{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity))}.active\:text-gray-800:active{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity))}.active\:outline-none:active{outline:2px solid transparent;outline-offset:2px}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-gray-50:disabled{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity))}.group:hover .group-hover\:border-transparent{border-color:transparent}.group:hover .group-hover\:text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.peer:checked~.peer-checked\:text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity))}.peer:checked~.peer-checked\:after\:translate-x-\[140\%\]:after{content:var(--tw-content);--tw-translate-x: 140%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.peer:focus~.peer-focus\:outline-none{outline:2px solid transparent;outline-offset:2px}@media (min-width: 640px){.sm\:inset-0{top:0;right:0;bottom:0;left:0}.sm\:col-span-2{grid-column:span 2 / span 2}.sm\:col-span-3{grid-column:span 3 / span 3}.sm\:col-span-4{grid-column:span 4 / span 4}.sm\:col-span-6{grid-column:span 6 / span 6}.sm\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.sm\:mx-0{margin-left:0;margin-right:0}.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:ml-3{margin-left:.75rem}.sm\:ml-4{margin-left:1rem}.sm\:ml-6{margin-left:1.5rem}.sm\:mt-0{margin-top:0}.sm\:mt-4{margin-top:1rem}.sm\:mt-6{margin-top:1.5rem}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:grid{display:grid}.sm\:hidden{display:none}.sm\:h-10{height:2.5rem}.sm\:h-screen{height:100vh}.sm\:w-10{width:2.5rem}.sm\:w-auto{width:auto}.sm\:w-full{width:100%}.sm\:max-w-lg{max-width:32rem}.sm\:max-w-sm{max-width:24rem}.sm\:flex-shrink-0{flex-shrink:0}.sm\:translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row-reverse{flex-direction:row-reverse}.sm\:flex-nowrap{flex-wrap:nowrap}.sm\:items-start{align-items:flex-start}.sm\:items-center{align-items:center}.sm\:justify-center{justify-content:center}.sm\:justify-between{justify-content:space-between}.sm\:gap-4{gap:1rem}.sm\:rounded-lg{border-radius:.5rem}.sm\:p-0{padding:0}.sm\:p-6{padding:1.5rem}.sm\:px-0{padding-left:0;padding-right:0}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:text-left{text-align:left}.sm\:align-middle{vertical-align:middle}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}}@media (min-width: 768px){.md\:col-span-1{grid-column:span 1 / span 1}.md\:col-span-2{grid-column:span 2 / span 2}.md\:col-span-4{grid-column:span 4 / span 4}.md\:col-span-5{grid-column:span 5 / span 5}.md\:col-span-6{grid-column:span 6 / span 6}.md\:col-start-2{grid-column-start:2}.md\:col-start-4{grid-column-start:4}.md\:mx-0,.md\:mx-\[0\]{margin-left:0;margin-right:0}.md\:-mr-1{margin-right:-.25rem}.md\:mb-6{margin-bottom:1.5rem}.md\:mb-\[46px\]{margin-bottom:46px}.md\:ml-2{margin-left:.5rem}.md\:ml-6{margin-left:1.5rem}.md\:mr-0{margin-right:0}.md\:mr-2{margin-right:.5rem}.md\:mt-0{margin-top:0}.md\:mt-10{margin-top:2.5rem}.md\:mt-5{margin-top:1.25rem}.md\:block{display:block}.md\:flex{display:flex}.md\:grid{display:grid}.md\:hidden{display:none}.md\:min-h-\[411px\]{min-height:411px}.md\:w-1\/2{width:50%}.md\:w-1\/3{width:33.333333%}.md\:max-w-3xl{max-width:48rem}.md\:max-w-xl{max-width:36rem}.md\:flex-shrink-0{flex-shrink:0}.md\:shrink{flex-shrink:1}.md\:grow-0{flex-grow:0}.md\:basis-1\/2{flex-basis:50%}.md\:basis-\[449px\]{flex-basis:449px}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:flex-col{flex-direction:column}.md\:items-center{align-items:center}.md\:justify-center{justify-content:center}.md\:justify-between{justify-content:space-between}.md\:gap-6{gap:1.5rem}.md\:gap-x-\[21px\]{-moz-column-gap:21px;column-gap:21px}.md\:gap-y-6{row-gap:1.5rem}.md\:border-r{border-right-width:1px}.md\:border-\[\#E5E7EB\]{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity))}.md\:p-24{padding:6rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:px-\[40px\]{padding-left:40px;padding-right:40px}.md\:pb-\[40px\]{padding-bottom:40px}.md\:pl-4{padding-left:1rem}.md\:pl-\[52px\]{padding-left:52px}.md\:pl-\[61px\]{padding-left:61px}.md\:pr-\[20px\]{padding-right:20px}.md\:pr-\[48px\]{padding-right:48px}.md\:pt-0{padding-top:0}.md\:pt-\[58px\]{padding-top:58px}.md\:text-left{text-align:left}.md\:text-center{text-align:center}.md\:text-2xl{font-size:1.5rem;line-height:2rem}.md\:text-\[30px\]{font-size:30px}.md\:text-\[32px\]{font-size:32px}.md\:text-sm{font-size:.875rem;line-height:1.25rem}}@media (min-width: 1024px){.lg\:col-span-3{grid-column:span 3 / span 3}.lg\:col-span-6{grid-column:span 6 / span 6}.lg\:col-span-7{grid-column:span 7 / span 7}.lg\:col-span-8{grid-column:span 8 / span 8}.lg\:col-start-3{grid-column-start:3}.lg\:col-start-4{grid-column-start:4}.lg\:-mx-8{margin-left:-2rem;margin-right:-2rem}.lg\:mt-24{margin-top:6rem}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:grid{display:grid}.lg\:hidden{display:none}.lg\:h-screen{height:100vh}.lg\:w-1\/2{width:50%}.lg\:w-1\/4{width:25%}.lg\:w-1\/5{width:20%}.lg\:max-w-\[80\%\]{max-width:80%}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:items-center{align-items:center}.lg\:gap-4{gap:1rem}.lg\:rounded-lg{border-radius:.5rem}.lg\:px-16{padding-left:4rem;padding-right:4rem}.lg\:px-2{padding-left:.5rem;padding-right:.5rem}.lg\:px-4{padding-left:1rem;padding-right:1rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:py-2{padding-top:.5rem;padding-bottom:.5rem}}@media (min-width: 1280px){.xl\:col-span-4{grid-column:span 4 / span 4}.xl\:col-span-6{grid-column:span 6 / span 6}.xl\:col-span-8{grid-column:span 8 / span 8}.xl\:col-span-9{grid-column:span 9 / span 9}.xl\:col-start-4{grid-column-start:4}.xl\:ml-5{margin-left:1.25rem}.xl\:mt-0{margin-top:0}.xl\:mt-32{margin-top:8rem}.xl\:flex{display:flex}.xl\:w-auto{width:auto}.xl\:basis-auto{flex-basis:auto}.xl\:flex-row{flex-direction:row}.xl\:flex-nowrap{flex-wrap:nowrap}.xl\:justify-center{justify-content:center}.xl\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.xl\:border-r{border-right-width:1px}.xl\:border-\[\#E5E7EB\]{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity))}.xl\:px-16{padding-left:4rem;padding-right:4rem}.xl\:px-20{padding-left:5rem;padding-right:5rem}.xl\:px-5{padding-left:1.25rem;padding-right:1.25rem}.xl\:pr-20{padding-right:5rem}.xl\:pt-0{padding-top:0}}@media (prefers-color-scheme: dark){.dark\:border-gray-600{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity))}.dark\:bg-gray-700{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity))}.dark\:text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.dark\:placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(156 163 175 / var(--tw-placeholder-opacity))}.dark\:placeholder-gray-400::placeholder{--tw-placeholder-opacity: 1;color:rgb(156 163 175 / var(--tw-placeholder-opacity))}.dark\:focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity))}.dark\:focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity))}}
+*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Open Sans,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}[type=text],input:where(:not([type])),[type=email],[type=url],[type=password],[type=number],[type=date],[type=datetime-local],[type=month],[type=search],[type=tel],[type=time],[type=week],[multiple],textarea,select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow: 0 0 #0000}[type=text]:focus,input:where(:not([type])):focus,[type=email]:focus,[type=url]:focus,[type=password]:focus,[type=number]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=month]:focus,[type=search]:focus,[type=tel]:focus,[type=time]:focus,[type=week]:focus,[multiple]:focus,textarea:focus,select:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#2563eb}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple],[size]:where(select:not([size="1"])){background-image:initial;background-position:initial;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#2563eb;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow: 0 0 #0000}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 2px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}[type=checkbox]:checked,[type=radio]:checked{border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}[type=checkbox]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")}@media (forced-colors: active){[type=checkbox]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=radio]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e")}@media (forced-colors: active){[type=radio]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:checked:hover,[type=checkbox]:checked:focus,[type=radio]:checked:hover,[type=radio]:checked:focus{border-color:transparent;background-color:currentColor}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}@media (forced-colors: active){[type=checkbox]:indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:indeterminate:hover,[type=checkbox]:indeterminate:focus{border-color:transparent;background-color:currentColor}[type=file]{background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.form-input,.form-textarea,.form-select,.form-multiselect{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow: 0 0 #0000}.form-input:focus,.form-textarea:focus,.form-select:focus,.form-multiselect:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#2563eb}.form-select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}.form-select:where([size]:not([size="1"])){background-image:initial;background-position:initial;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}.form-checkbox,.form-radio{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#2563eb;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow: 0 0 #0000}.form-checkbox{border-radius:0}.form-radio{border-radius:100%}.form-checkbox:focus,.form-radio:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 2px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.form-checkbox:checked,.form-radio:checked{border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}.form-checkbox:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")}@media (forced-colors: active){.form-checkbox:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}.form-radio:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e")}@media (forced-colors: active){.form-radio:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}.form-checkbox:checked:hover,.form-checkbox:checked:focus,.form-radio:checked:hover,.form-radio:checked:focus{border-color:transparent;background-color:currentColor}.form-checkbox:indeterminate{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}@media (forced-colors: active){.form-checkbox:indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}.form-checkbox:indeterminate:hover,.form-checkbox:indeterminate:focus{border-color:transparent;background-color:currentColor}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-left:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-left-width:.25rem;border-left-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-left:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%),0 3px 0 rgb(var(--tw-prose-kbd-shadows) / 10%);font-size:.875em;border-radius:.3125rem;padding:.1875em .375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding:.8571429em 1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;text-align:left;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-right:.5714286em;padding-bottom:.5714286em;padding-left:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body: #374151;--tw-prose-headings: #111827;--tw-prose-lead: #4b5563;--tw-prose-links: #111827;--tw-prose-bold: #111827;--tw-prose-counters: #6b7280;--tw-prose-bullets: #d1d5db;--tw-prose-hr: #e5e7eb;--tw-prose-quotes: #111827;--tw-prose-quote-borders: #e5e7eb;--tw-prose-captions: #6b7280;--tw-prose-kbd: #111827;--tw-prose-kbd-shadows: 17 24 39;--tw-prose-code: #111827;--tw-prose-pre-code: #e5e7eb;--tw-prose-pre-bg: #1f2937;--tw-prose-th-borders: #d1d5db;--tw-prose-td-borders: #e5e7eb;--tw-prose-invert-body: #d1d5db;--tw-prose-invert-headings: #fff;--tw-prose-invert-lead: #9ca3af;--tw-prose-invert-links: #fff;--tw-prose-invert-bold: #fff;--tw-prose-invert-counters: #9ca3af;--tw-prose-invert-bullets: #4b5563;--tw-prose-invert-hr: #374151;--tw-prose-invert-quotes: #f3f4f6;--tw-prose-invert-quote-borders: #374151;--tw-prose-invert-captions: #9ca3af;--tw-prose-invert-kbd: #fff;--tw-prose-invert-kbd-shadows: 255 255 255;--tw-prose-invert-code: #fff;--tw-prose-invert-pre-code: #d1d5db;--tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);--tw-prose-invert-th-borders: #4b5563;--tw-prose-invert-td-borders: #374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-left:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-left:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>*:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>*:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>*:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>*:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-left:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-left:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-right:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-left:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-right:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.button{border-radius:.25rem;padding:.75rem 1rem;font-size:.875rem;line-height:1rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}button:disabled{cursor:not-allowed;opacity:.5}.button-primary{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.button-primary:hover{font-weight:600}.button-block{display:block;width:100%}.button-danger{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.button-danger:hover{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity))}.button-secondary{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.button-secondary:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity))}.button-link{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity))}.button-link:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity));text-decoration-line:underline}.button-link:focus{text-decoration-line:underline;outline:2px solid transparent;outline-offset:2px}.validation{margin-top:.5rem;margin-bottom:.25rem;border-left-width:2px;--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity));padding:.25rem .75rem}.validation-fail{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity));font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity))}.validation-pass{--tw-border-opacity: 1;border-color:rgb(16 185 129 / var(--tw-border-opacity));font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity))}.input{margin-top:.5rem;align-items:center;border-radius:.25rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem}.input:focus{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity));outline:2px solid transparent;outline-offset:2px}.input-label{font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity))}.input-slim{padding-top:.5rem;padding-bottom:.5rem}.form-checkbox{cursor:pointer;border-radius:.25rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity))}.form-select{border-width:1px;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity))}.alert{margin-top:.5rem;margin-bottom:.25rem;border-left-width:2px;--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity));padding:.75rem 1rem;font-size:.875rem;line-height:1.25rem}.alert-success{--tw-border-opacity: 1;border-color:rgb(16 185 129 / var(--tw-border-opacity))}.alert-failure{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity))}.badge{display:inline-flex;align-items:center;border-radius:9999px;padding:.125rem .625rem;font-size:.75rem;font-weight:500;line-height:1rem}.badge-light{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity));--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity))}.badge-primary{--tw-bg-opacity: 1;background-color:rgb(191 219 254 / var(--tw-bg-opacity));--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity))}.badge-danger{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity));--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity))}.badge-success{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity));--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity))}.badge-secondary{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity));--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity))}.badge-warning{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity));--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity))}.badge-info{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity));--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity))}@media (min-width: 640px){.dataTables_length{margin-top:1.25rem!important;margin-bottom:1.25rem!important}}@media (min-width: 1024px){.dataTables_length{margin-top:1rem!important;margin-bottom:1rem!important}}.dataTables_length select{margin-left:.5rem!important;margin-right:.5rem!important;--tw-bg-opacity: 1 !important;background-color:rgb(255 255 255 / var(--tw-bg-opacity))!important;margin-top:.5rem;align-items:center;border-radius:.25rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem}.dataTables_length select:focus{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity));outline:2px solid transparent;outline-offset:2px}.dataTables_filter{margin-bottom:1rem}.dataTables_filter input{margin-top:.5rem;align-items:center;border-radius:.25rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem}.dataTables_filter input:focus{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity));outline:2px solid transparent;outline-offset:2px}@media (min-width: 1024px){.dataTables_filter{margin-top:-3rem!important}}.dataTables_paginate{padding-bottom:1.5rem!important;padding-top:.5rem!important}.dataTables_paginate .paginate_button{margin-right:.25rem!important;cursor:pointer!important;border-width:1px!important;--tw-border-opacity: 1 !important;border-color:rgb(209 213 219 / var(--tw-border-opacity))!important;--tw-bg-opacity: 1 !important;background-color:rgb(255 255 255 / var(--tw-bg-opacity))!important;font-weight:500!important;--tw-text-opacity: 1 !important;color:rgb(55 65 81 / var(--tw-text-opacity))!important;border-radius:.25rem;padding:.75rem 1rem;font-size:.875rem;line-height:1rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dataTables_paginate .current{--tw-bg-opacity: 1 !important;background-color:rgb(37 99 235 / var(--tw-bg-opacity))!important;--tw-text-opacity: 1 !important;color:rgb(255 255 255 / var(--tw-text-opacity))!important}.dataTables_info{font-size:.875rem!important;line-height:1.25rem!important}.dataTables_empty{padding-top:1rem!important;padding-bottom:1rem!important}.pagination{display:flex!important;align-items:center!important}.pagination .page-link{margin-top:-1px!important;display:inline-flex!important;cursor:pointer!important;align-items:center!important;border-top-width:2px!important;border-color:transparent!important;padding-left:1rem!important;padding-right:1rem!important;padding-top:1rem!important;font-size:.875rem!important;font-weight:500!important;line-height:1.25rem!important;--tw-text-opacity: 1 !important;color:rgb(107 114 128 / var(--tw-text-opacity))!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter!important;transition-duration:.15s!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.pagination .page-link:hover{--tw-border-opacity: 1 !important;border-color:rgb(209 213 219 / var(--tw-border-opacity))!important;--tw-text-opacity: 1 !important;color:rgb(55 65 81 / var(--tw-text-opacity))!important}.pagination .page-link:focus{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity));--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity));outline:2px solid transparent;outline-offset:2px}.pagination .active>span{--tw-border-opacity: 1 !important;border-color:rgb(37 99 235 / var(--tw-border-opacity))!important;--tw-text-opacity: 1 !important;color:rgb(37 99 235 / var(--tw-text-opacity))!important}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.left-0{left:0}.left-1{left:.25rem}.right-0{right:0}.top-0{top:0}.top-1{top:.25rem}.z-0{z-index:0}.z-10{z-index:10}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.col-auto{grid-column:auto}.col-span-1{grid-column:span 1 / span 1}.col-span-12{grid-column:span 12 / span 12}.col-span-2{grid-column:span 2 / span 2}.col-span-3{grid-column:span 3 / span 3}.col-span-4{grid-column:span 4 / span 4}.col-span-6{grid-column:span 6 / span 6}.col-span-8{grid-column:span 8 / span 8}.float-right{float:right}.m-0{margin:0}.m-auto{margin:auto}.-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.mx-\[22px\]{margin-left:22px;margin-right:22px}.mx-\[40px\]{margin-left:40px;margin-right:40px}.mx-\[auto\],.mx-auto{margin-left:auto;margin-right:auto}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.-ml-1{margin-left:-.25rem}.-ml-4{margin-left:-1rem}.-ml-px{margin-left:-1px}.-mr-1{margin-right:-.25rem}.-mr-14{margin-right:-3.5rem}.-mt-4{margin-top:-1rem}.-mt-6{margin-top:-1.5rem}.mb-0{margin-bottom:0}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.mb-\[10px\]{margin-bottom:10px}.mb-\[11px\]{margin-bottom:11px}.mb-\[20px\]{margin-bottom:20px}.mb-\[25px\]{margin-bottom:25px}.mb-\[26px\]{margin-bottom:26px}.mb-\[36px\]{margin-bottom:36px}.mb-\[40px\]{margin-bottom:40px}.mb-\[5px\]{margin-bottom:5px}.ml-0{margin-left:0}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-5{margin-left:1.25rem}.ml-\[10px\]{margin-left:10px}.mr-0{margin-right:0}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mr-4{margin-right:1rem}.mr-5{margin-right:1.25rem}.mt-0{margin-top:0}.mt-1{margin-top:.25rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-20{margin-top:5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-\[30px\]{margin-top:30px}.mt-\[50px\]{margin-top:50px}.mt-\[auto\]{margin-top:auto}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-0{height:0px}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-24{height:6rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-8{height:2rem}.h-\[40px\]{height:40px}.h-auto{height:auto}.h-fit{height:-moz-fit-content;height:fit-content}.h-full{height:100%}.h-screen{height:100vh}.min-h-\[450px\]{min-height:450px}.min-h-screen{min-height:100vh}.w-0{width:0px}.w-1{width:.25rem}.w-1\/2{width:50%}.w-1\/6{width:16.666667%}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-24{width:6rem}.w-3\/4{width:75%}.w-4{width:1rem}.w-4\/5{width:80%}.w-4\/6{width:66.666667%}.w-48{width:12rem}.w-5{width:1.25rem}.w-5\/6{width:83.333333%}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-80{width:20rem}.w-\[100\%\]{width:100%}.w-\[87px\]{width:87px}.w-auto{width:auto}.w-full{width:100%}.w-screen{width:100vw}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-\[212px\]{max-width:212px}.max-w-\[450px\]{max-width:450px}.max-w-\[625px\]{max-width:625px}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.flex-grow,.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-1\/2{flex-basis:50%}.basis-full{flex-basis:100%}.table-auto{table-layout:auto}.border-collapse{border-collapse:collapse}.origin-top-right{transform-origin:top right}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-4{--tw-translate-y: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.place-content-end{place-content:end}.place-items-center{place-items:center}.content-center{align-content:center}.content-start{align-content:flex-start}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-stretch{justify-content:stretch}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-\[13px\]{gap:13px}.gap-\[44px\]{gap:44px}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-y-\[20px\]{row-gap:20px}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-y-scroll{overflow-y:scroll}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.overflow-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-\[10px\]{border-radius:10px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-4{border-width:4px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-t-2{border-top-width:2px}.border-t-4{border-top-width:4px}.border-t-\[0px\]{border-top-width:0px}.border-t-\[10px\]{border-top-width:10px}.border-t-\[1px\]{border-top-width:1px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-\[\#E5E7EB\]{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity))}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity))}.border-emerald-500{--tw-border-opacity: 1;border-color:rgb(16 185 129 / var(--tw-border-opacity))}.border-fuchsia-600{--tw-border-opacity: 1;border-color:rgb(192 38 211 / var(--tw-border-opacity))}.border-gray-100{--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity))}.border-gray-500{--tw-border-opacity: 1;border-color:rgb(107 114 128 / var(--tw-border-opacity))}.border-gray-600{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity))}.border-red-300{--tw-border-opacity: 1;border-color:rgb(252 165 165 / var(--tw-border-opacity))}.border-red-400{--tw-border-opacity: 1;border-color:rgb(248 113 113 / var(--tw-border-opacity))}.border-red-900{--tw-border-opacity: 1;border-color:rgb(127 29 29 / var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-opacity-50{--tw-border-opacity: .5}.bg-\[\#F2F9FE\]{--tw-bg-opacity: 1;background-color:rgb(242 249 254 / var(--tw-bg-opacity))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity))}.bg-blue-700{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity))}.bg-emerald-600{--tw-bg-opacity: 1;background-color:rgb(5 150 105 / var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity))}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.bg-opacity-100{--tw-bg-opacity: 1}.bg-clip-padding{background-clip:padding-box}.fill-current{fill:currentColor}.object-cover{-o-object-fit:cover;object-fit:cover}.object-scale-down{-o-object-fit:scale-down;object-fit:scale-down}.object-center{-o-object-position:center;object-position:center}.p-1{padding:.25rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-8{padding:2rem}.p-\[12px\]{padding:12px}.p-\[20px\]{padding:20px}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-12{padding-left:3rem;padding-right:3rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-\[12px\]{padding-left:12px;padding-right:12px}.px-\[20px\]{padding-left:20px;padding-right:20px}.px-\[22px\]{padding-left:22px;padding-right:22px}.py-0{padding-top:0;padding-bottom:0}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-\[33px\]{padding-top:33px;padding-bottom:33px}.py-\[36px\]{padding-top:36px;padding-bottom:36px}.py-\[9\.5px\]{padding-top:9.5px;padding-bottom:9.5px}.pb-10{padding-bottom:2.5rem}.pb-2{padding-bottom:.5rem}.pb-20{padding-bottom:5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pb-\[20px\]{padding-bottom:20px}.pb-\[56px\]{padding-bottom:56px}.pb-\[58px\]{padding-bottom:58px}.pl-0{padding-left:0}.pl-1{padding-left:.25rem}.pl-1\.5{padding-left:.375rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-\[18px\]{padding-left:18px}.pr-10{padding-right:2.5rem}.pr-2{padding-right:.5rem}.pr-4{padding-right:1rem}.pr-\[18px\]{padding-right:18px}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.pt-\[20px\]{padding-top:20px}.pt-\[29px\]{padding-top:29px}.pt-\[35px\]{padding-top:35px}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.font-\[\'Open_Sans\'\]{font-family:Open Sans}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-5xl{font-size:3rem;line-height:1}.text-\[12px\]{font-size:12px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[16px\]{font-size:16px}.text-\[22px\]{font-size:22px}.text-\[24px\]{font-size:24px}.text-\[35px\]{font-size:35px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-\[16px\]{font-weight:16px}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-9{line-height:2.25rem}.leading-\[1\.2rem\]{line-height:1.2rem}.leading-\[1\.35em\]{line-height:1.35em}.leading-\[1\.36em\]{line-height:1.36em}.leading-\[1\.375em\]{line-height:1.375em}.leading-\[1\.3em\]{line-height:1.3em}.leading-\[1\.5em\]{line-height:1.5em}.leading-\[1\.75em\]{line-height:1.75em}.leading-normal{line-height:1.5}.leading-tight{line-height:1.25}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-\[\#212529\]{--tw-text-opacity: 1;color:rgb(33 37 41 / var(--tw-text-opacity))}.text-\[\#6C727F\]{--tw-text-opacity: 1;color:rgb(108 114 127 / var(--tw-text-opacity))}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity))}.text-indigo-600{--tw-text-opacity: 1;color:rgb(79 70 229 / var(--tw-text-opacity))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity))}.text-red-900{--tw-text-opacity: 1;color:rgb(127 29 29 / var(--tw-text-opacity))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-75{opacity:.75}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-black{--tw-ring-opacity: 1;--tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity))}.ring-opacity-5{--tw-ring-opacity: .05}.grayscale{--tw-grayscale: grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.invert{--tw-invert: invert(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-1000{transition-duration:1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{transition-timing-function:linear}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.placeholder\:text-gray-500::-moz-placeholder{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}.placeholder\:text-gray-500::placeholder{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:left-\[8px\]:after{content:var(--tw-content);left:8px}.after\:top-\[5px\]:after{content:var(--tw-content);top:5px}.after\:h-\[30px\]:after{content:var(--tw-content);height:30px}.after\:w-\[30px\]:after{content:var(--tw-content);width:30px}.after\:rounded-full:after{content:var(--tw-content);border-radius:9999px}.after\:bg-white:after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.after\:transition-all:after{content:var(--tw-content);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.after\:content-\[\'\'\]:after{--tw-content: "";content:var(--tw-content)}.focus-within\:z-10:focus-within{z-index:10}.hover\:list-disc:hover{list-style-type:disc}.hover\:border-blue-600:hover{--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity))}.hover\:border-gray-600:hover{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity))}.hover\:border-gray-800:hover{--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity))}.hover\:border-transparent:hover{border-color:transparent}.hover\:bg-blue-500:hover{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity))}.hover\:bg-blue-600:hover{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.hover\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity))}.hover\:bg-red-900:hover{--tw-bg-opacity: 1;background-color:rgb(127 29 29 / var(--tw-bg-opacity))}.hover\:font-semibold:hover{font-weight:600}.hover\:text-blue-600:hover{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity))}.hover\:text-gray-300:hover{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity))}.hover\:text-gray-700:hover{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity))}.hover\:text-gray-800:hover{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity))}.hover\:text-gray-900:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity))}.hover\:text-indigo-900:hover{--tw-text-opacity: 1;color:rgb(49 46 129 / var(--tw-text-opacity))}.hover\:text-red-500:hover{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-2xl:hover{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-lg:hover{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-blue-300:focus{--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity))}.focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity))}.focus\:border-fuchsia-300:focus{--tw-border-opacity: 1;border-color:rgb(240 171 252 / var(--tw-border-opacity))}.focus\:border-indigo-500:focus{--tw-border-opacity: 1;border-color:rgb(99 102 241 / var(--tw-border-opacity))}.focus\:border-red-500:focus{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity))}.focus\:bg-gray-100:focus{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.focus\:bg-gray-600:focus{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity))}.focus\:bg-white:focus{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.focus\:font-semibold:focus{font-weight:600}.focus\:text-gray-500:focus{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}.focus\:text-gray-600:focus{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity))}.focus\:text-gray-900:focus{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity))}.focus\:underline:focus{text-decoration-line:underline}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity))}.focus\:ring-indigo-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity))}.focus\:ring-indigo-600:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(79 70 229 / var(--tw-ring-opacity))}.focus\:ring-red-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity))}.focus\:ring-opacity-50:focus{--tw-ring-opacity: .5}.active\:bg-gray-50:active{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity))}.active\:text-gray-800:active{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity))}.active\:outline-none:active{outline:2px solid transparent;outline-offset:2px}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-gray-50:disabled{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity))}.group:hover .group-hover\:border-transparent{border-color:transparent}.group:hover .group-hover\:text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.peer:checked~.peer-checked\:text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity))}.peer:checked~.peer-checked\:after\:translate-x-\[140\%\]:after{content:var(--tw-content);--tw-translate-x: 140%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.peer:focus~.peer-focus\:outline-none{outline:2px solid transparent;outline-offset:2px}@media (min-width: 640px){.sm\:inset-0{top:0;right:0;bottom:0;left:0}.sm\:col-span-2{grid-column:span 2 / span 2}.sm\:col-span-3{grid-column:span 3 / span 3}.sm\:col-span-4{grid-column:span 4 / span 4}.sm\:col-span-6{grid-column:span 6 / span 6}.sm\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.sm\:mx-0{margin-left:0;margin-right:0}.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:ml-3{margin-left:.75rem}.sm\:ml-4{margin-left:1rem}.sm\:ml-6{margin-left:1.5rem}.sm\:mt-0{margin-top:0}.sm\:mt-4{margin-top:1rem}.sm\:mt-6{margin-top:1.5rem}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:grid{display:grid}.sm\:hidden{display:none}.sm\:h-10{height:2.5rem}.sm\:h-screen{height:100vh}.sm\:w-10{width:2.5rem}.sm\:w-auto{width:auto}.sm\:w-full{width:100%}.sm\:max-w-lg{max-width:32rem}.sm\:max-w-sm{max-width:24rem}.sm\:flex-shrink-0{flex-shrink:0}.sm\:translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row-reverse{flex-direction:row-reverse}.sm\:flex-nowrap{flex-wrap:nowrap}.sm\:items-start{align-items:flex-start}.sm\:items-center{align-items:center}.sm\:justify-center{justify-content:center}.sm\:justify-between{justify-content:space-between}.sm\:gap-4{gap:1rem}.sm\:rounded-lg{border-radius:.5rem}.sm\:p-0{padding:0}.sm\:p-6{padding:1.5rem}.sm\:px-0{padding-left:0;padding-right:0}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:text-left{text-align:left}.sm\:align-middle{vertical-align:middle}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}}@media (min-width: 768px){.md\:col-span-1{grid-column:span 1 / span 1}.md\:col-span-2{grid-column:span 2 / span 2}.md\:col-span-4{grid-column:span 4 / span 4}.md\:col-span-5{grid-column:span 5 / span 5}.md\:col-span-6{grid-column:span 6 / span 6}.md\:col-start-2{grid-column-start:2}.md\:col-start-4{grid-column-start:4}.md\:mx-0,.md\:mx-\[0\]{margin-left:0;margin-right:0}.md\:-mr-1{margin-right:-.25rem}.md\:mb-6{margin-bottom:1.5rem}.md\:mb-\[46px\]{margin-bottom:46px}.md\:ml-2{margin-left:.5rem}.md\:ml-6{margin-left:1.5rem}.md\:mr-0{margin-right:0}.md\:mr-2{margin-right:.5rem}.md\:mt-0{margin-top:0}.md\:mt-10{margin-top:2.5rem}.md\:mt-5{margin-top:1.25rem}.md\:block{display:block}.md\:flex{display:flex}.md\:grid{display:grid}.md\:hidden{display:none}.md\:min-h-\[411px\]{min-height:411px}.md\:w-1\/2{width:50%}.md\:w-1\/3{width:33.333333%}.md\:max-w-3xl{max-width:48rem}.md\:max-w-xl{max-width:36rem}.md\:flex-shrink-0{flex-shrink:0}.md\:shrink{flex-shrink:1}.md\:grow-0{flex-grow:0}.md\:basis-1\/2{flex-basis:50%}.md\:basis-\[449px\]{flex-basis:449px}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:flex-col{flex-direction:column}.md\:items-center{align-items:center}.md\:justify-center{justify-content:center}.md\:justify-between{justify-content:space-between}.md\:gap-6{gap:1.5rem}.md\:gap-x-\[21px\]{-moz-column-gap:21px;column-gap:21px}.md\:gap-y-6{row-gap:1.5rem}.md\:border-r{border-right-width:1px}.md\:border-\[\#E5E7EB\]{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity))}.md\:p-24{padding:6rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:px-\[40px\]{padding-left:40px;padding-right:40px}.md\:pb-\[40px\]{padding-bottom:40px}.md\:pl-4{padding-left:1rem}.md\:pl-\[52px\]{padding-left:52px}.md\:pl-\[61px\]{padding-left:61px}.md\:pr-\[20px\]{padding-right:20px}.md\:pr-\[48px\]{padding-right:48px}.md\:pt-0{padding-top:0}.md\:pt-\[58px\]{padding-top:58px}.md\:text-left{text-align:left}.md\:text-center{text-align:center}.md\:text-2xl{font-size:1.5rem;line-height:2rem}.md\:text-\[30px\]{font-size:30px}.md\:text-\[32px\]{font-size:32px}.md\:text-sm{font-size:.875rem;line-height:1.25rem}}@media (min-width: 1024px){.lg\:col-span-3{grid-column:span 3 / span 3}.lg\:col-span-6{grid-column:span 6 / span 6}.lg\:col-span-7{grid-column:span 7 / span 7}.lg\:col-span-8{grid-column:span 8 / span 8}.lg\:col-start-3{grid-column-start:3}.lg\:col-start-4{grid-column-start:4}.lg\:-mx-8{margin-left:-2rem;margin-right:-2rem}.lg\:mt-24{margin-top:6rem}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:grid{display:grid}.lg\:hidden{display:none}.lg\:h-screen{height:100vh}.lg\:w-1\/2{width:50%}.lg\:w-1\/4{width:25%}.lg\:w-1\/5{width:20%}.lg\:max-w-\[80\%\]{max-width:80%}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:items-center{align-items:center}.lg\:gap-4{gap:1rem}.lg\:rounded-lg{border-radius:.5rem}.lg\:px-16{padding-left:4rem;padding-right:4rem}.lg\:px-2{padding-left:.5rem;padding-right:.5rem}.lg\:px-4{padding-left:1rem;padding-right:1rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:py-2{padding-top:.5rem;padding-bottom:.5rem}}@media (min-width: 1280px){.xl\:col-span-4{grid-column:span 4 / span 4}.xl\:col-span-6{grid-column:span 6 / span 6}.xl\:col-span-8{grid-column:span 8 / span 8}.xl\:col-span-9{grid-column:span 9 / span 9}.xl\:col-start-4{grid-column-start:4}.xl\:ml-5{margin-left:1.25rem}.xl\:mt-0{margin-top:0}.xl\:mt-32{margin-top:8rem}.xl\:flex{display:flex}.xl\:w-auto{width:auto}.xl\:basis-auto{flex-basis:auto}.xl\:flex-row{flex-direction:row}.xl\:flex-nowrap{flex-wrap:nowrap}.xl\:justify-center{justify-content:center}.xl\:border-r{border-right-width:1px}.xl\:border-\[\#E5E7EB\]{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity))}.xl\:px-16{padding-left:4rem;padding-right:4rem}.xl\:px-20{padding-left:5rem;padding-right:5rem}.xl\:px-5{padding-left:1.25rem;padding-right:1.25rem}.xl\:pr-20{padding-right:5rem}}@media (prefers-color-scheme: dark){.dark\:border-gray-600{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity))}.dark\:bg-gray-700{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity))}.dark\:text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.dark\:placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(156 163 175 / var(--tw-placeholder-opacity))}.dark\:placeholder-gray-400::placeholder{--tw-placeholder-opacity: 1;color:rgb(156 163 175 / var(--tw-placeholder-opacity))}.dark\:focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity))}.dark\:focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity))}}
diff --git a/public/build/manifest.json b/public/build/manifest.json
index 7a7d645ef733..a1d08aa563fa 100644
--- a/public/build/manifest.json
+++ b/public/build/manifest.json
@@ -240,7 +240,7 @@
"src": "resources/js/setup/setup.js"
},
"resources/sass/app.scss": {
- "file": "assets/app-c7c5fad4.css",
+ "file": "assets/app-f3b33400.css",
"isEntry": true,
"src": "resources/sass/app.scss"
}
diff --git a/resources/views/portal/ninja2020/components/livewire/required-client-info.blade.php b/resources/views/portal/ninja2020/components/livewire/required-client-info.blade.php
index 39aa9e1d4f72..80070339824d 100644
--- a/resources/views/portal/ninja2020/components/livewire/required-client-info.blade.php
+++ b/resources/views/portal/ninja2020/components/livewire/required-client-info.blade.php
@@ -1,4 +1,4 @@
-