From 187882985136af8ef2261599a5e79a1b52bf4f33 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 5 Mar 2024 08:55:23 +1100 Subject: [PATCH 01/21] Fixes for signature display --- resources/views/email/admin/generic_email.blade.php | 2 +- resources/views/email/client/generic.blade.php | 2 +- resources/views/email/template/dark.blade.php | 2 +- resources/views/email/template/light.blade.php | 4 +--- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/resources/views/email/admin/generic_email.blade.php b/resources/views/email/admin/generic_email.blade.php index f55411056e41..409b8e2ebdaf 100644 --- a/resources/views/email/admin/generic_email.blade.php +++ b/resources/views/email/admin/generic_email.blade.php @@ -30,7 +30,7 @@ @endisset @isset($signature) -

{{ $signature }}

+

{!! nl2br($signature) !!}

@endisset @endcomponent \ No newline at end of file diff --git a/resources/views/email/client/generic.blade.php b/resources/views/email/client/generic.blade.php index a4f8684fdc36..9f400d1049fb 100644 --- a/resources/views/email/client/generic.blade.php +++ b/resources/views/email/client/generic.blade.php @@ -48,7 +48,7 @@ @endisset @isset($signature) -

{{ nl2br($signature) }}

+

{!! nl2br($signature) !!}

@endisset @endcomponent diff --git a/resources/views/email/template/dark.blade.php b/resources/views/email/template/dark.blade.php index faaf2b30acce..1a234c6bf321 100644 --- a/resources/views/email/template/dark.blade.php +++ b/resources/views/email/template/dark.blade.php @@ -10,7 +10,7 @@

- {!! $signature !!} +{!! nl2br($signature) !!}

@endif diff --git a/resources/views/email/template/light.blade.php b/resources/views/email/template/light.blade.php index 01b2cb06839b..ae9781fdee31 100644 --- a/resources/views/email/template/light.blade.php +++ b/resources/views/email/template/light.blade.php @@ -9,9 +9,7 @@ @if($signature)

-

- {!! $signature !!} -

+

{!! nl2br($signature) !!}

@endif @isset($email_preferences) From e7ae3f81cb96c1bbd7ce32f715884f56b51080bf Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 5 Mar 2024 11:27:53 +1100 Subject: [PATCH 02/21] Catch no refund date --- app/Services/Template/TemplateService.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 9ab4eaa25d35..37bd568f8ee5 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -717,7 +717,7 @@ class TemplateService return collect($payment->refund_meta) ->map(function ($refund) use ($payment) { - $date = \Carbon\Carbon::parse($refund['date'])->addSeconds($payment->client->timezone_offset()); + $date = \Carbon\Carbon::parse($refund['date'] ?? $payment->date)->addSeconds($payment->client->timezone_offset()); $date = $this->translateDate($date, $payment->client->date_format(), $payment->client->locale()); $entity = ctrans('texts.invoice'); From a43bd9c6de89dac13bd138143f3d6d304b08eaa2 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 5 Mar 2024 13:58:26 +1100 Subject: [PATCH 03/21] Updates for reports --- app/Export/CSV/BaseExport.php | 300 ++++++- app/Export/CSV/ClientExport.php | 2 +- app/Export/CSV/CreditExport.php | 40 +- app/Export/CSV/ExpenseExport.php | 55 +- app/Export/CSV/InvoiceExport.php | 2 +- app/Export/CSV/InvoiceItemExport.php | 8 +- app/Export/CSV/PaymentExport.php | 2 + app/Export/CSV/PurchaseOrderExport.php | 4 +- app/Export/CSV/PurchaseOrderItemExport.php | 4 +- app/Export/CSV/QuoteExport.php | 4 +- app/Export/CSV/QuoteItemExport.php | 4 +- app/Export/CSV/RecurringInvoiceExport.php | 4 +- app/Export/CSV/TaskExport.php | 30 +- app/Export/CSV/VendorExport.php | 2 +- .../Requests/Report/GenericReportRequest.php | 5 +- app/Livewire/PdfSlot.php | 1 + composer.lock | 745 ++++++++---------- .../Export/ReportCsvGenerationTest.php | 5 + 18 files changed, 781 insertions(+), 436 deletions(-) diff --git a/app/Export/CSV/BaseExport.php b/app/Export/CSV/BaseExport.php index debee0f7dd38..9806ba2f8c74 100644 --- a/app/Export/CSV/BaseExport.php +++ b/app/Export/CSV/BaseExport.php @@ -826,8 +826,15 @@ class BaseExport return ''; } - - public function applyFilters(Builder $query): Builder + + /** + * Apply Product Filters + * + * @param Builder $query + * + * @return Builder + */ + public function applyProductFilters(Builder $query): Builder { if(isset($this->input['product_key'])) { @@ -844,8 +851,16 @@ class BaseExport return $query; } - - protected function addClientFilter($query, $clients): Builder + + /** + * Add Client Filter + * + * @param Builder $query + * @param string $clients + * + * @return Builder + */ + protected function addClientFilter(Builder $query, string $clients): Builder { if(is_string($clients)) { $clients = explode(',', $clients); @@ -862,8 +877,16 @@ class BaseExport return $query; } - - protected function addVendorFilter($query, $vendors): Builder + + /** + * Add Vendor Filter + * + * @param Builder $query + * @param string $vendors + * + * @return Builder + */ + protected function addVendorFilter(Builder$query, string $vendors): Builder { if(is_string($vendors)) { @@ -878,8 +901,16 @@ class BaseExport return $query; } - - protected function addProjectFilter($query, $projects): Builder + + /** + * AddProjectFilter + * + * @param Builder $query + * @param string $projects + * + * @return Builder + */ + protected function addProjectFilter(Builder $query, string $projects): Builder { if(is_string($projects)) { @@ -894,8 +925,16 @@ class BaseExport return $query; } - - protected function addCategoryFilter($query, $expense_categories): Builder + + /** + * Add Category Filter + * + * @param Builder $query + * @param string $expense_categories + * + * @return Builder + */ + protected function addCategoryFilter(Builder $query, string $expense_categories): Builder { if(is_string($expense_categories)) { @@ -911,13 +950,230 @@ class BaseExport return $query; } - - protected function addInvoiceStatusFilter($query, $status): Builder + + /** + * Add Payment Status Filters + * + * @param Builder $query + * @param string $status + * + * @return Builder + */ + protected function addPaymentStatusFilters(Builder $query, string $status): Builder { $status_parameters = explode(',', $status); - if(in_array('all', $status_parameters)) { + if(in_array('all', $status_parameters) || count($status_parameters) == 0) { + return $query; + } + + $query->where(function ($query) use ($status_parameters) { + $payment_filters = []; + + if (in_array('pending', $status_parameters)) { + $payment_filters[] = Payment::STATUS_PENDING; + } + + if (in_array('cancelled', $status_parameters)) { + $payment_filters[] = Payment::STATUS_CANCELLED; + } + + if (in_array('failed', $status_parameters)) { + $payment_filters[] = Payment::STATUS_FAILED; + } + + if (in_array('completed', $status_parameters)) { + $payment_filters[] = Payment::STATUS_COMPLETED; + } + + if (in_array('partially_refunded', $status_parameters)) { + $payment_filters[] = Payment::STATUS_PARTIALLY_REFUNDED; + } + + if (in_array('refunded', $status_parameters)) { + $payment_filters[] = Payment::STATUS_REFUNDED; + } + + if (count($payment_filters) > 0) { + $query->whereIn('status_id', $payment_filters); + } + + if(in_array('partially_unapplied', $status_parameters)) { + $query->whereColumn('amount', '>', 'applied')->where('refunded', 0); + } + }); + + return $query; + + } + + /** + * Add RecurringInvoice Status Filter + * + * @param Builder $query + * @param string $status + * + * @return Builder + */ + protected function addRecurringInvoiceStatusFilter(Builder $query, string $status): Builder + { + + $status_parameters = explode(',', $status); + + if (in_array('all', $status_parameters) || count($status_parameters) == 0){ + return $query; + } + + $recurring_filters = []; + + if (in_array('active', $status_parameters)) { + $recurring_filters[] = RecurringInvoice::STATUS_ACTIVE; + } + + if (in_array('paused', $status_parameters)) { + $recurring_filters[] = RecurringInvoice::STATUS_PAUSED; + } + + if (in_array('completed', $status_parameters)) { + $recurring_filters[] = RecurringInvoice::STATUS_COMPLETED; + } + + if (count($recurring_filters) >= 1) { + return $query->whereIn('status_id', $recurring_filters); + } + + return $query; + + } + /** + * Add QuoteStatus Filter + * + * @param Builder $query + * @param string $status + * + * @return Builder + */ + protected function addQuoteStatusFilter(Builder $query, string $status): Builder + { + + $status_parameters = explode(',', $status); + + if (in_array('all', $status_parameters)) { + return $query; + } + + $query->where(function ($query) use ($status_parameters) { + if (in_array('sent', $status_parameters)) { + $query->orWhere(function ($q) { + $q->where('status_id', Quote::STATUS_SENT) + ->whereNull('due_date') + ->orWhere('due_date', '>=', now()->toDateString()); + }); + } + + $quote_filters = []; + + if (in_array('draft', $status_parameters)) { + $quote_filters[] = Quote::STATUS_DRAFT; + } + + if (in_array('approved', $status_parameters)) { + $quote_filters[] = Quote::STATUS_APPROVED; + } + + if (count($quote_filters) > 0) { + $query->orWhereIn('status_id', $quote_filters); + } + + if (in_array('expired', $status_parameters)) { + $query->orWhere(function ($q) { + $q->where('status_id', Quote::STATUS_SENT) + ->whereNotNull('due_date') + ->where('due_date', '<=', now()->toDateString()); + }); + } + + if (in_array('upcoming', $status_parameters)) { + $query->orWhere(function ($q) { + $q->where('status_id', Quote::STATUS_SENT) + ->where('due_date', '>=', now()->toDateString()) + ->orderBy('due_date', 'DESC'); + }); + } + + if(in_array('converted', $status_parameters)) { + $query->orWhere(function ($q) { + $q->whereNotNull('invoice_id'); + }); + } + }); + + return $query; + } + + /** + * Add PurchaseOrder Status Filter + * + * @param Builder $query + * @param string $status + * + * @return Builder + */ + protected function addPurchaseOrderStatusFilter(Builder $query, string $status): Builder + { + + $status_parameters = explode(',', $status); + + if (in_array('all', $status_parameters) || count($status_parameters) == 0) { + return $query; + } + + $query->where(function ($query) use ($status_parameters) { + $po_status = []; + + if (in_array('draft', $status_parameters)) { + $po_status[] = PurchaseOrder::STATUS_DRAFT; + } + + if (in_array('sent', $status_parameters)) { + $query->orWhere(function ($q) { + $q->where('status_id', PurchaseOrder::STATUS_SENT) + ->whereNull('due_date') + ->orWhere('due_date', '>=', now()->toDateString()); + }); + } + + if (in_array('accepted', $status_parameters)) { + $po_status[] = PurchaseOrder::STATUS_ACCEPTED; + } + + if (in_array('cancelled', $status_parameters)) { + $po_status[] = PurchaseOrder::STATUS_CANCELLED; + } + + if (count($po_status) >= 1) { + $query->whereIn('status_id', $po_status); + } + }); + + return $query; + + } + + /** + * Add Invoice Status Filter + * + * @param Builder $query + * @param string $status + * @return Builder + */ + protected function addInvoiceStatusFilter(Builder $query, string $status): Builder + { + + $status_parameters = explode(',', $status); + + if(in_array('all', $status_parameters) || count($status_parameters) == 0) { return $query; } @@ -942,6 +1198,10 @@ class BaseExport $invoice_filters[] = Invoice::STATUS_PARTIAL; } + if (in_array('cancelled', $status_parameters)) { + $invoice_filters[] = Invoice::STATUS_CANCELLED; + } + if (count($invoice_filters) > 0) { $nested->whereIn('status_id', $invoice_filters); } @@ -965,15 +1225,19 @@ class BaseExport return $query; } - - protected function addDateRange($query) + + /** + * Add Date Range + * + * @param Builder $query + * @return Builder + */ + protected function addDateRange(Builder $query): Builder { - $query = $this->applyFilters($query); + $query = $this->applyProductFilters($query); $date_range = $this->input['date_range']; - nlog($date_range); - if (array_key_exists('date_key', $this->input) && strlen($this->input['date_key']) > 1) { $this->date_key = $this->input['date_key']; } diff --git a/app/Export/CSV/ClientExport.php b/app/Export/CSV/ClientExport.php index e10e6e9cec45..87171a8dc8e2 100644 --- a/app/Export/CSV/ClientExport.php +++ b/app/Export/CSV/ClientExport.php @@ -127,7 +127,7 @@ class ClientExport extends BaseExport $query = Client::query()->with('contacts') ->withTrashed() ->where('company_id', $this->company->id) - ->where('is_deleted', 0); + ->where('is_deleted', $this->input['include_deleted']); $query = $this->addDateRange($query); diff --git a/app/Export/CSV/CreditExport.php b/app/Export/CSV/CreditExport.php index 0973f7a70473..9d2885c7d107 100644 --- a/app/Export/CSV/CreditExport.php +++ b/app/Export/CSV/CreditExport.php @@ -103,10 +103,14 @@ class CreditExport extends BaseExport ->withTrashed() ->with('client') ->where('company_id', $this->company->id) - ->where('is_deleted', 0); + ->where('is_deleted', $this->input['include_deleted']); $query = $this->addDateRange($query); + if($this->input['status'] ?? false) { + $query = $this->addCreditStatusFilter($query, $this->input['status']); + } + if($this->input['document_email_attachment'] ?? false) { $this->queueDocuments($query); } @@ -162,6 +166,40 @@ class CreditExport extends BaseExport return $this->decorateAdvancedFields($credit, $entity); } + public function addCreditStatusFilter($query, $status): Builder + { + + $status_parameters = explode(',', $status); + + if (in_array('all', $status_parameters)) { + return $query; + } + + $credit_filters = []; + + if (in_array('draft', $status_parameters)) { + $credit_filters[] = Credit::STATUS_DRAFT; + } + + if (in_array('sent', $status_parameters)) { + $credit_filters[] = Credit::STATUS_SENT; + } + + if (in_array('partial', $status_parameters)) { + $credit_filters[] = Credit::STATUS_PARTIAL; + } + + if (in_array('applied', $status_parameters)) { + $credit_filters[] = Credit::STATUS_APPLIED; + } + + if (count($credit_filters) >= 1) { + $query->whereIn('status_id', $credit_filters); + } + + return $query; + } + private function decorateAdvancedFields(Credit $credit, array $entity): array { // if (in_array('country_id', $this->input['report_keys'])) { diff --git a/app/Export/CSV/ExpenseExport.php b/app/Export/CSV/ExpenseExport.php index b5be8b4f8458..8713a4b2db69 100644 --- a/app/Export/CSV/ExpenseExport.php +++ b/app/Export/CSV/ExpenseExport.php @@ -83,10 +83,14 @@ class ExpenseExport extends BaseExport ->with('client') ->withTrashed() ->where('company_id', $this->company->id) - ->where('is_deleted', 0); + ->where('is_deleted', $this->input['include_deleted']); $query = $this->addDateRange($query); + if($this->input['status'] ?? false) { + $query = $this->addExpenseStatusFilter($query, $this->input['status']); + } + if(isset($this->input['clients'])) { $query = $this->addClientFilter($query, $this->input['clients']); } @@ -152,6 +156,55 @@ class ExpenseExport extends BaseExport return $this->decorateAdvancedFields($expense, $entity); } + protected function addExpenseStatusFilter($query, $status): Builder + { + + $status_parameters = explode(',', $status); + + if (in_array('all', $status_parameters)) { + return $query; + } + + $query->where(function ($query) use ($status_parameters) { + if (in_array('logged', $status_parameters)) { + $query->orWhere(function ($query) { + $query->where('amount', '>', 0) + ->whereNull('invoice_id') + ->whereNull('payment_date') + ->where('should_be_invoiced', false); + }); + } + + if (in_array('pending', $status_parameters)) { + $query->orWhere(function ($query) { + $query->where('should_be_invoiced', true) + ->whereNull('invoice_id'); + }); + } + + if (in_array('invoiced', $status_parameters)) { + $query->orWhere(function ($query) { + $query->whereNotNull('invoice_id'); + }); + } + + if (in_array('paid', $status_parameters)) { + $query->orWhere(function ($query) { + $query->whereNotNull('payment_date'); + }); + } + + if (in_array('unpaid', $status_parameters)) { + $query->orWhere(function ($query) { + $query->whereNull('payment_date'); + }); + } + + }); + + return $query; + } + private function decorateAdvancedFields(Expense $expense, array $entity): array { // if (in_array('expense.currency_id', $this->input['report_keys'])) { diff --git a/app/Export/CSV/InvoiceExport.php b/app/Export/CSV/InvoiceExport.php index 546b3689ba90..9c81fadab634 100644 --- a/app/Export/CSV/InvoiceExport.php +++ b/app/Export/CSV/InvoiceExport.php @@ -58,7 +58,7 @@ class InvoiceExport extends BaseExport ->withTrashed() ->with('client') ->where('company_id', $this->company->id) - ->where('is_deleted', 0); + ->where('is_deleted', $this->input['include_deleted']); $query = $this->addDateRange($query); diff --git a/app/Export/CSV/InvoiceItemExport.php b/app/Export/CSV/InvoiceItemExport.php index b701b2faa2f1..54cfd22bc3ef 100644 --- a/app/Export/CSV/InvoiceItemExport.php +++ b/app/Export/CSV/InvoiceItemExport.php @@ -71,11 +71,15 @@ class InvoiceItemExport extends BaseExport ->withTrashed() ->with('client') ->where('company_id', $this->company->id) - ->where('is_deleted', 0); + ->where('is_deleted', $this->input['include_deleted']); $query = $this->addDateRange($query); - $query = $this->applyFilters($query); + if($this->input['status'] ?? false) { + $query = $this->addInvoiceStatusFilter($query, $this->input['status']); + } + + $query = $this->applyProductFilters($query); if($this->input['document_email_attachment'] ?? false) { $this->queueDocuments($query); diff --git a/app/Export/CSV/PaymentExport.php b/app/Export/CSV/PaymentExport.php index 93550f9545c3..ee217d1c6a9a 100644 --- a/app/Export/CSV/PaymentExport.php +++ b/app/Export/CSV/PaymentExport.php @@ -61,6 +61,8 @@ class PaymentExport extends BaseExport $query = $this->addDateRange($query); + $query = $this->addPaymentStatusFilters($query, $this->input['status'] ?? ''); + if($this->input['document_email_attachment'] ?? false) { $this->queueDocuments($query); } diff --git a/app/Export/CSV/PurchaseOrderExport.php b/app/Export/CSV/PurchaseOrderExport.php index f1fa4501510b..a43702b035fb 100644 --- a/app/Export/CSV/PurchaseOrderExport.php +++ b/app/Export/CSV/PurchaseOrderExport.php @@ -104,10 +104,12 @@ class PurchaseOrderExport extends BaseExport ->withTrashed() ->with('vendor') ->where('company_id', $this->company->id) - ->where('is_deleted', 0); + ->where('is_deleted', $this->input['include_deleted']); $query = $this->addDateRange($query); + $query = $this->addPurchaseOrderStatusFilter($query, $this->input['status'] ?? ''); + if($this->input['document_email_attachment'] ?? false) { $this->queueDocuments($query); } diff --git a/app/Export/CSV/PurchaseOrderItemExport.php b/app/Export/CSV/PurchaseOrderItemExport.php index ccdd7a8dc27d..a4f9cc5de795 100644 --- a/app/Export/CSV/PurchaseOrderItemExport.php +++ b/app/Export/CSV/PurchaseOrderItemExport.php @@ -63,10 +63,12 @@ class PurchaseOrderItemExport extends BaseExport $query = PurchaseOrder::query() ->withTrashed() ->with('vendor')->where('company_id', $this->company->id) - ->where('is_deleted', 0); + ->where('is_deleted', $this->input['include_deleted']); $query = $this->addDateRange($query); + $query = $this->addPurchaseOrderStatusFilter($query, $this->input['status'] ?? ''); + if($this->input['document_email_attachment'] ?? false) { $this->queueDocuments($query); } diff --git a/app/Export/CSV/QuoteExport.php b/app/Export/CSV/QuoteExport.php index 1242ba19f6de..195354419c67 100644 --- a/app/Export/CSV/QuoteExport.php +++ b/app/Export/CSV/QuoteExport.php @@ -65,10 +65,12 @@ class QuoteExport extends BaseExport ->withTrashed() ->with('client') ->where('company_id', $this->company->id) - ->where('is_deleted', 0); + ->where('is_deleted', $this->input['include_deleted']); $query = $this->addDateRange($query); + $query = $this->addQuoteStatusFilter($query, $this->input['status'] ?? ''); + if($this->input['document_email_attachment'] ?? false) { $this->queueDocuments($query); } diff --git a/app/Export/CSV/QuoteItemExport.php b/app/Export/CSV/QuoteItemExport.php index bdb16061d53b..e4be3a330bdd 100644 --- a/app/Export/CSV/QuoteItemExport.php +++ b/app/Export/CSV/QuoteItemExport.php @@ -66,10 +66,12 @@ class QuoteItemExport extends BaseExport $query = Quote::query() ->withTrashed() ->with('client')->where('company_id', $this->company->id) - ->where('is_deleted', 0); + ->where('is_deleted', $this->input['include_deleted']); $query = $this->addDateRange($query); + $query = $this->addQuoteStatusFilter($query, $this->input['status'] ?? ''); + if($this->input['document_email_attachment'] ?? false) { $this->queueDocuments($query); } diff --git a/app/Export/CSV/RecurringInvoiceExport.php b/app/Export/CSV/RecurringInvoiceExport.php index 20545468fd26..c56338c6b3e1 100644 --- a/app/Export/CSV/RecurringInvoiceExport.php +++ b/app/Export/CSV/RecurringInvoiceExport.php @@ -57,10 +57,12 @@ class RecurringInvoiceExport extends BaseExport ->withTrashed() ->with('client') ->where('company_id', $this->company->id) - ->where('is_deleted', 0); + ->where('is_deleted', $this->input['include_deleted']); $query = $this->addDateRange($query); + $query = $this->addRecurringInvoiceStatusFilter($query, $this->input['status'] ?? ''); + return $query; } diff --git a/app/Export/CSV/TaskExport.php b/app/Export/CSV/TaskExport.php index 7e91a32dadad..861ea68bb6df 100644 --- a/app/Export/CSV/TaskExport.php +++ b/app/Export/CSV/TaskExport.php @@ -68,7 +68,7 @@ class TaskExport extends BaseExport $query = Task::query() ->withTrashed() ->where('company_id', $this->company->id) - ->where('is_deleted', 0); + ->where('is_deleted', $this->input['include_deleted']); $query = $this->addDateRange($query); @@ -202,6 +202,34 @@ class TaskExport extends BaseExport } } + + /** + * Add Task Status Filter + * + * @param Builder $query + * @param string $status + * @return Builder + */ + protected function addTaskStatusFilter(Builder $query, string $status): Builder + { + + $status_parameters = explode(',', $status); + + if (in_array('all', $status_parameters) || count($status_parameters) == 0) { + return $query; + } + + if (in_array('invoiced', $status_parameters)) { + $query->whereNotNull('invoice_id'); + } + + if (in_array('uninvoiced', $status_parameters)) { + $query->whereNull('invoice_id'); + } + + return $query; + + } private function decorateAdvancedFields(Task $task, array $entity): array { diff --git a/app/Export/CSV/VendorExport.php b/app/Export/CSV/VendorExport.php index a98ee80f825a..86fef19f7336 100644 --- a/app/Export/CSV/VendorExport.php +++ b/app/Export/CSV/VendorExport.php @@ -62,7 +62,7 @@ class VendorExport extends BaseExport $query = Vendor::query()->with('contacts') ->withTrashed() ->where('company_id', $this->company->id) - ->where('is_deleted', 0); + ->where('is_deleted', $this->input['include_deleted']); $query = $this->addDateRange($query); diff --git a/app/Http/Requests/Report/GenericReportRequest.php b/app/Http/Requests/Report/GenericReportRequest.php index 6a0bdfad51f4..c7c94a8fd86e 100644 --- a/app/Http/Requests/Report/GenericReportRequest.php +++ b/app/Http/Requests/Report/GenericReportRequest.php @@ -37,7 +37,8 @@ class GenericReportRequest extends Request 'start_date' => 'bail|required_if:date_range,custom|nullable|date', 'report_keys' => 'present|array', 'send_email' => 'required|bool', - 'document_email_attachment' => 'sometimes|bool' + 'document_email_attachment' => 'sometimes|bool', + 'include_deleted' => 'required|bool', // 'status' => 'sometimes|string|nullable|in:all,draft,sent,viewed,paid,unpaid,overdue', ]; } @@ -63,6 +64,8 @@ class GenericReportRequest extends Request $input['end_date'] = null; } + $input['include_deleted'] = array_key_exists('include_deleted', $input) ? filter_var($input['include_deleted'], FILTER_VALIDATE_BOOLEAN) : false; + $input['user_id'] = auth()->user()->id; $this->replace($input); diff --git a/app/Livewire/PdfSlot.php b/app/Livewire/PdfSlot.php index 047f8cc812d2..1322d6a9664f 100644 --- a/app/Livewire/PdfSlot.php +++ b/app/Livewire/PdfSlot.php @@ -149,6 +149,7 @@ class PdfSlot extends Component return render('components.livewire.pdf-slot', [ 'invitation' => $this->invitation, 'entity' => $this->entity, + 'settings' => $this->settings, 'data' => $this->invitation->company->settings, 'entity_type' => $this->entity_type, 'products' => $this->getProducts(), diff --git a/composer.lock b/composer.lock index 473b8697effe..6777702814ae 100644 --- a/composer.lock +++ b/composer.lock @@ -707,16 +707,16 @@ }, { "name": "amphp/socket", - "version": "v2.2.3", + "version": "v2.2.4", "source": { "type": "git", "url": "https://github.com/amphp/socket.git", - "reference": "40c80bdc67a9f975ecb5f4083e3c84ef9f23eace" + "reference": "4223324c627cc26d44800630411e64856d3344bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/socket/zipball/40c80bdc67a9f975ecb5f4083e3c84ef9f23eace", - "reference": "40c80bdc67a9f975ecb5f4083e3c84ef9f23eace", + "url": "https://api.github.com/repos/amphp/socket/zipball/4223324c627cc26d44800630411e64856d3344bc", + "reference": "4223324c627cc26d44800630411e64856d3344bc", "shasum": "" }, "require": { @@ -779,7 +779,7 @@ ], "support": { "issues": "https://github.com/amphp/socket/issues", - "source": "https://github.com/amphp/socket/tree/v2.2.3" + "source": "https://github.com/amphp/socket/tree/v2.2.4" }, "funding": [ { @@ -787,7 +787,7 @@ "type": "github" } ], - "time": "2024-02-13T21:03:09+00:00" + "time": "2024-02-28T15:56:06+00:00" }, { "name": "amphp/sync", @@ -918,16 +918,16 @@ }, { "name": "apimatic/core", - "version": "0.3.5", + "version": "0.3.6", "source": { "type": "git", "url": "https://github.com/apimatic/core-lib-php.git", - "reference": "0ccfb70c2b01bde35c30b451546ab6510193a992" + "reference": "2236fa751f265397d97ab2cb8a5c72641cf9480f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/apimatic/core-lib-php/zipball/0ccfb70c2b01bde35c30b451546ab6510193a992", - "reference": "0ccfb70c2b01bde35c30b451546ab6510193a992", + "url": "https://api.github.com/repos/apimatic/core-lib-php/zipball/2236fa751f265397d97ab2cb8a5c72641cf9480f", + "reference": "2236fa751f265397d97ab2cb8a5c72641cf9480f", "shasum": "" }, "require": { @@ -965,9 +965,9 @@ ], "support": { "issues": "https://github.com/apimatic/core-lib-php/issues", - "source": "https://github.com/apimatic/core-lib-php/tree/0.3.5" + "source": "https://github.com/apimatic/core-lib-php/tree/0.3.6" }, - "time": "2024-01-17T13:46:44+00:00" + "time": "2024-02-26T04:16:28+00:00" }, { "name": "apimatic/core-interfaces", @@ -1227,25 +1227,25 @@ }, { "name": "awobaz/compoships", - "version": "2.2.3", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/topclaudy/compoships.git", - "reference": "404901e2ebd6794f70d2710a56edd4b0c500ce1f" + "reference": "25a4ed2aeeb22033cd951e71e661eed235d58698" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/topclaudy/compoships/zipball/404901e2ebd6794f70d2710a56edd4b0c500ce1f", - "reference": "404901e2ebd6794f70d2710a56edd4b0c500ce1f", + "url": "https://api.github.com/repos/topclaudy/compoships/zipball/25a4ed2aeeb22033cd951e71e661eed235d58698", + "reference": "25a4ed2aeeb22033cd951e71e661eed235d58698", "shasum": "" }, "require": { - "fakerphp/faker": "^1.18", - "illuminate/database": ">=5.6 <11.0" + "illuminate/database": ">=5.6 <12.0" }, "require-dev": { "ext-sqlite3": "*", - "phpunit/phpunit": "^6.0|^8.0|^9.0" + "fakerphp/faker": "^1.18", + "phpunit/phpunit": "^6.0|^8.0|^9.0|^10.0" }, "suggest": { "awobaz/blade-active": "Blade directives for the Laravel 'Active' package", @@ -1277,7 +1277,7 @@ ], "support": { "issues": "https://github.com/topclaudy/compoships/issues", - "source": "https://github.com/topclaudy/compoships/tree/2.2.3" + "source": "https://github.com/topclaudy/compoships/tree/2.3.0" }, "funding": [ { @@ -1285,7 +1285,7 @@ "type": "custom" } ], - "time": "2023-02-22T16:52:55+00:00" + "time": "2024-02-28T22:21:15+00:00" }, { "name": "aws/aws-crt-php", @@ -1343,16 +1343,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.299.1", + "version": "3.300.10", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "a0f87b8e8bfb9afd0ffd702fcda556b465eee457" + "reference": "b24bf7882fed0ef029996dcdcba6c273b69db8fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/a0f87b8e8bfb9afd0ffd702fcda556b465eee457", - "reference": "a0f87b8e8bfb9afd0ffd702fcda556b465eee457", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/b24bf7882fed0ef029996dcdcba6c273b69db8fe", + "reference": "b24bf7882fed0ef029996dcdcba6c273b69db8fe", "shasum": "" }, "require": { @@ -1432,9 +1432,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.299.1" + "source": "https://github.com/aws/aws-sdk-php/tree/3.300.10" }, - "time": "2024-02-16T19:08:34+00:00" + "time": "2024-03-04T19:06:07+00:00" }, { "name": "bacon/bacon-qr-code", @@ -1851,16 +1851,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "b66d11b7479109ab547f9405b97205640b17d385" + "reference": "3ce240142f6d59b808dd65c1f52f7a1c252e6cfd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/b66d11b7479109ab547f9405b97205640b17d385", - "reference": "b66d11b7479109ab547f9405b97205640b17d385", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/3ce240142f6d59b808dd65c1f52f7a1c252e6cfd", + "reference": "3ce240142f6d59b808dd65c1f52f7a1c252e6cfd", "shasum": "" }, "require": { @@ -1907,7 +1907,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.4.0" + "source": "https://github.com/composer/ca-bundle/tree/1.4.1" }, "funding": [ { @@ -1923,7 +1923,7 @@ "type": "tidelift" } ], - "time": "2023-12-18T12:05:55+00:00" + "time": "2024-02-23T10:16:52+00:00" }, { "name": "dasprid/enum", @@ -2094,82 +2094,6 @@ }, "time": "2022-10-27T11:44:00+00:00" }, - { - "name": "doctrine/annotations", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", - "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", - "shasum": "" - }, - "require": { - "doctrine/lexer": "^2 || ^3", - "ext-tokenizer": "*", - "php": "^7.2 || ^8.0", - "psr/cache": "^1 || ^2 || ^3" - }, - "require-dev": { - "doctrine/cache": "^2.0", - "doctrine/coding-standard": "^10", - "phpstan/phpstan": "^1.8.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^5.4 || ^6", - "vimeo/psalm": "^4.10" - }, - "suggest": { - "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "https://www.doctrine-project.org/projects/annotations.html", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "support": { - "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/2.0.1" - }, - "time": "2023-02-02T22:02:53+00:00" - }, { "name": "doctrine/cache", "version": "2.2.0", @@ -2265,16 +2189,16 @@ }, { "name": "doctrine/dbal", - "version": "3.8.2", + "version": "3.8.3", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "a19a1d05ca211f41089dffcc387733a6875196cb" + "reference": "db922ba9436b7b18a23d1653a0b41ff2369ca41c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/a19a1d05ca211f41089dffcc387733a6875196cb", - "reference": "a19a1d05ca211f41089dffcc387733a6875196cb", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/db922ba9436b7b18a23d1653a0b41ff2369ca41c", + "reference": "db922ba9436b7b18a23d1653a0b41ff2369ca41c", "shasum": "" }, "require": { @@ -2290,12 +2214,12 @@ "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.10.57", + "phpstan/phpstan": "1.10.58", "phpstan/phpstan-strict-rules": "^1.5", "phpunit/phpunit": "9.6.16", "psalm/plugin-phpunit": "0.18.4", "slevomat/coding-standard": "8.13.1", - "squizlabs/php_codesniffer": "3.8.1", + "squizlabs/php_codesniffer": "3.9.0", "symfony/cache": "^5.4|^6.0|^7.0", "symfony/console": "^4.4|^5.4|^6.0|^7.0", "vimeo/psalm": "4.30.0" @@ -2358,7 +2282,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.8.2" + "source": "https://github.com/doctrine/dbal/tree/3.8.3" }, "funding": [ { @@ -2374,7 +2298,7 @@ "type": "tidelift" } ], - "time": "2024-02-12T18:36:36+00:00" + "time": "2024-03-03T15:55:06+00:00" }, { "name": "doctrine/deprecations", @@ -2516,16 +2440,16 @@ }, { "name": "doctrine/inflector", - "version": "2.0.9", + "version": "2.0.10", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "2930cd5ef353871c821d5c43ed030d39ac8cfe65" + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/2930cd5ef353871c821d5c43ed030d39ac8cfe65", - "reference": "2930cd5ef353871c821d5c43ed030d39ac8cfe65", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", "shasum": "" }, "require": { @@ -2587,7 +2511,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.9" + "source": "https://github.com/doctrine/inflector/tree/2.0.10" }, "funding": [ { @@ -2603,7 +2527,7 @@ "type": "tidelift" } ], - "time": "2024-01-15T18:05:13+00:00" + "time": "2024-02-18T20:23:39+00:00" }, { "name": "doctrine/instantiator", @@ -2882,16 +2806,16 @@ }, { "name": "endroid/qr-code", - "version": "5.0.4", + "version": "5.0.5", "source": { "type": "git", "url": "https://github.com/endroid/qr-code.git", - "reference": "0efd071a3640af323e23c94122fe92cfd5199833" + "reference": "739fc545bfade2470765219dc2a615a6f1e94987" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/endroid/qr-code/zipball/0efd071a3640af323e23c94122fe92cfd5199833", - "reference": "0efd071a3640af323e23c94122fe92cfd5199833", + "url": "https://api.github.com/repos/endroid/qr-code/zipball/739fc545bfade2470765219dc2a615a6f1e94987", + "reference": "739fc545bfade2470765219dc2a615a6f1e94987", "shasum": "" }, "require": { @@ -2945,7 +2869,7 @@ ], "support": { "issues": "https://github.com/endroid/qr-code/issues", - "source": "https://github.com/endroid/qr-code/tree/5.0.4" + "source": "https://github.com/endroid/qr-code/tree/5.0.5" }, "funding": [ { @@ -2953,7 +2877,7 @@ "type": "github" } ], - "time": "2023-12-24T13:47:07+00:00" + "time": "2024-03-03T18:17:54+00:00" }, { "name": "eway/eway-rapid-php", @@ -3455,16 +3379,16 @@ }, { "name": "google/apiclient-services", - "version": "v0.335.0", + "version": "v0.338.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client-services.git", - "reference": "3e6cea8f43066378babdf00e718f01c7c55233fd" + "reference": "52aeb042c8d30ac0f98f4051dd4bc523708b1306" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/3e6cea8f43066378babdf00e718f01c7c55233fd", - "reference": "3e6cea8f43066378babdf00e718f01c7c55233fd", + "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/52aeb042c8d30ac0f98f4051dd4bc523708b1306", + "reference": "52aeb042c8d30ac0f98f4051dd4bc523708b1306", "shasum": "" }, "require": { @@ -3493,22 +3417,22 @@ ], "support": { "issues": "https://github.com/googleapis/google-api-php-client-services/issues", - "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.335.0" + "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.338.0" }, - "time": "2024-02-12T01:08:15+00:00" + "time": "2024-03-03T00:56:15+00:00" }, { "name": "google/auth", - "version": "v1.35.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-auth-library-php.git", - "reference": "6e9c9fd4e2bbd7042f50083076346e4a1eff4e4b" + "reference": "5f16f67375b6f202b857183d7ef4e076acd7d4aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/6e9c9fd4e2bbd7042f50083076346e4a1eff4e4b", - "reference": "6e9c9fd4e2bbd7042f50083076346e4a1eff4e4b", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/5f16f67375b6f202b857183d7ef4e076acd7d4aa", + "reference": "5f16f67375b6f202b857183d7ef4e076acd7d4aa", "shasum": "" }, "require": { @@ -3551,9 +3475,9 @@ "support": { "docs": "https://googleapis.github.io/google-auth-library-php/main/", "issues": "https://github.com/googleapis/google-auth-library-php/issues", - "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.35.0" + "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.37.0" }, - "time": "2024-02-01T20:41:08+00:00" + "time": "2024-02-21T17:03:52+00:00" }, { "name": "graham-campbell/result-type", @@ -4873,16 +4797,16 @@ }, { "name": "invoiceninja/ubl_invoice", - "version": "v2.0.2", + "version": "v2.0.3", "source": { "type": "git", "url": "https://github.com/invoiceninja/UBL_invoice.git", - "reference": "02735339bf89f9a48da7d8b11d991dbe812d713e" + "reference": "ed10f4f5804e6bcce15d0491b5d35c10ea7cd9f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/invoiceninja/UBL_invoice/zipball/02735339bf89f9a48da7d8b11d991dbe812d713e", - "reference": "02735339bf89f9a48da7d8b11d991dbe812d713e", + "url": "https://api.github.com/repos/invoiceninja/UBL_invoice/zipball/ed10f4f5804e6bcce15d0491b5d35c10ea7cd9f1", + "reference": "ed10f4f5804e6bcce15d0491b5d35c10ea7cd9f1", "shasum": "" }, "require": { @@ -4931,9 +4855,9 @@ "xml invoice" ], "support": { - "source": "https://github.com/invoiceninja/UBL_invoice/tree/v2.0.2" + "source": "https://github.com/invoiceninja/UBL_invoice/tree/v2.0.3" }, - "time": "2024-02-05T02:16:14+00:00" + "time": "2024-02-17T06:34:35+00:00" }, { "name": "jean85/pretty-package-versions", @@ -5060,27 +4984,27 @@ }, { "name": "jms/serializer", - "version": "3.29.1", + "version": "3.30.0", "source": { "type": "git", "url": "https://github.com/schmittjoh/serializer.git", - "reference": "111451f43abb448ce297361a8ab96a9591e848cd" + "reference": "bf1105358123d7c02ee6cad08ea33ab535a09d5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/111451f43abb448ce297361a8ab96a9591e848cd", - "reference": "111451f43abb448ce297361a8ab96a9591e848cd", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/bf1105358123d7c02ee6cad08ea33ab535a09d5e", + "reference": "bf1105358123d7c02ee6cad08ea33ab535a09d5e", "shasum": "" }, "require": { - "doctrine/annotations": "^1.14 || ^2.0", "doctrine/instantiator": "^1.3.1 || ^2.0", "doctrine/lexer": "^2.0 || ^3.0", "jms/metadata": "^2.6", - "php": "^7.2 || ^8.0", + "php": "^7.4 || ^8.0", "phpstan/phpdoc-parser": "^1.20" }, "require-dev": { + "doctrine/annotations": "^1.14 || ^2.0", "doctrine/coding-standard": "^12.0", "doctrine/orm": "^2.14 || ^3.0", "doctrine/persistence": "^2.5.2 || ^3.0", @@ -5090,16 +5014,17 @@ "ocramius/proxy-manager": "^1.0 || ^2.0", "phpbench/phpbench": "^1.0", "phpstan/phpstan": "^1.0.2", - "phpunit/phpunit": "^8.5.21 || ^9.0 || ^10.0", + "phpunit/phpunit": "^9.0 || ^10.0", "psr/container": "^1.0 || ^2.0", - "symfony/dependency-injection": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0", - "symfony/expression-language": "^3.2 || ^4.0 || ^5.0 || ^6.0 || ^7.0", - "symfony/filesystem": "^4.2 || ^5.0 || ^6.0 || ^7.0", - "symfony/form": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0", - "symfony/translation": "^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0", - "symfony/uid": "^5.1 || ^6.0 || ^7.0", - "symfony/validator": "^3.1.9 || ^4.0 || ^5.0 || ^6.0 || ^7.0", - "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "rector/rector": "^0.19.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/expression-language": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/form": "^5.4 || ^6.0 || ^7.0", + "symfony/translation": "^5.4 || ^6.0 || ^7.0", + "symfony/uid": "^5.4 || ^6.0 || ^7.0", + "symfony/validator": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0", "twig/twig": "^1.34 || ^2.4 || ^3.0" }, "suggest": { @@ -5144,7 +5069,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/serializer/issues", - "source": "https://github.com/schmittjoh/serializer/tree/3.29.1" + "source": "https://github.com/schmittjoh/serializer/tree/3.30.0" }, "funding": [ { @@ -5152,7 +5077,7 @@ "type": "github" } ], - "time": "2023-12-14T15:25:09+00:00" + "time": "2024-02-24T14:12:14+00:00" }, { "name": "josemmo/facturae-php", @@ -5370,16 +5295,16 @@ }, { "name": "laravel/framework", - "version": "v10.44.0", + "version": "v10.46.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "1199dbe361787bbe9648131a79f53921b4148cf6" + "reference": "5e95946a8283a8d5c015035793f9c61c297e937f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/1199dbe361787bbe9648131a79f53921b4148cf6", - "reference": "1199dbe361787bbe9648131a79f53921b4148cf6", + "url": "https://api.github.com/repos/laravel/framework/zipball/5e95946a8283a8d5c015035793f9c61c297e937f", + "reference": "5e95946a8283a8d5c015035793f9c61c297e937f", "shasum": "" }, "require": { @@ -5572,20 +5497,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-02-13T16:01:16+00:00" + "time": "2024-02-27T16:46:54+00:00" }, { "name": "laravel/prompts", - "version": "v0.1.15", + "version": "v0.1.16", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "d814a27514d99b03c85aa42b22cfd946568636c1" + "reference": "ca6872ab6aec3ab61db3a61f83a6caf764ec7781" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/d814a27514d99b03c85aa42b22cfd946568636c1", - "reference": "d814a27514d99b03c85aa42b22cfd946568636c1", + "url": "https://api.github.com/repos/laravel/prompts/zipball/ca6872ab6aec3ab61db3a61f83a6caf764ec7781", + "reference": "ca6872ab6aec3ab61db3a61f83a6caf764ec7781", "shasum": "" }, "require": { @@ -5627,9 +5552,9 @@ ], "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.15" + "source": "https://github.com/laravel/prompts/tree/v0.1.16" }, - "time": "2023-12-29T22:37:42+00:00" + "time": "2024-02-21T19:25:27+00:00" }, { "name": "laravel/serializable-closure", @@ -6278,16 +6203,16 @@ }, { "name": "league/csv", - "version": "9.14.0", + "version": "9.15.0", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "34bf0df7340b60824b9449b5c526fcc3325070d5" + "reference": "fa7e2441c0bc9b2360f4314fd6c954f7ff40d435" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/34bf0df7340b60824b9449b5c526fcc3325070d5", - "reference": "34bf0df7340b60824b9449b5c526fcc3325070d5", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/fa7e2441c0bc9b2360f4314fd6c954f7ff40d435", + "reference": "fa7e2441c0bc9b2360f4314fd6c954f7ff40d435", "shasum": "" }, "require": { @@ -6302,12 +6227,12 @@ "ext-xdebug": "*", "friendsofphp/php-cs-fixer": "^v3.22.0", "phpbench/phpbench": "^1.2.15", - "phpstan/phpstan": "^1.10.50", + "phpstan/phpstan": "^1.10.57", "phpstan/phpstan-deprecation-rules": "^1.1.4", "phpstan/phpstan-phpunit": "^1.3.15", "phpstan/phpstan-strict-rules": "^1.5.2", - "phpunit/phpunit": "^10.5.3", - "symfony/var-dumper": "^6.4.0" + "phpunit/phpunit": "^10.5.9", + "symfony/var-dumper": "^6.4.2" }, "suggest": { "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", @@ -6363,7 +6288,7 @@ "type": "github" } ], - "time": "2023-12-29T07:34:53+00:00" + "time": "2024-02-20T20:00:00+00:00" }, { "name": "league/flysystem", @@ -7021,16 +6946,16 @@ }, { "name": "livewire/livewire", - "version": "v3.4.4", + "version": "v3.4.6", "source": { "type": "git", "url": "https://github.com/livewire/livewire.git", - "reference": "c0489d4a76382f6dcf6e2702112f86aa089d0c8d" + "reference": "7e7d638183b34fb61621455891869f5abfd55a82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/c0489d4a76382f6dcf6e2702112f86aa089d0c8d", - "reference": "c0489d4a76382f6dcf6e2702112f86aa089d0c8d", + "url": "https://api.github.com/repos/livewire/livewire/zipball/7e7d638183b34fb61621455891869f5abfd55a82", + "reference": "7e7d638183b34fb61621455891869f5abfd55a82", "shasum": "" }, "require": { @@ -7084,7 +7009,7 @@ "description": "A front-end framework for Laravel.", "support": { "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v3.4.4" + "source": "https://github.com/livewire/livewire/tree/v3.4.6" }, "funding": [ { @@ -7092,7 +7017,7 @@ "type": "github" } ], - "time": "2024-01-28T19:07:11+00:00" + "time": "2024-02-20T14:04:25+00:00" }, { "name": "maennchen/zipstream-php", @@ -8011,16 +7936,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.0.0", + "version": "v5.0.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc" + "reference": "2218c2252c874a4624ab2f613d86ac32d227bc69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4a21235f7e56e713259a6f76bf4b5ea08502b9dc", - "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/2218c2252c874a4624ab2f613d86ac32d227bc69", + "reference": "2218c2252c874a4624ab2f613d86ac32d227bc69", "shasum": "" }, "require": { @@ -8063,9 +7988,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.1" }, - "time": "2024-01-07T17:17:35+00:00" + "time": "2024-02-21T19:24:10+00:00" }, { "name": "nordigen/nordigen-php", @@ -8733,16 +8658,16 @@ }, { "name": "payfast/payfast-php-sdk", - "version": "v1.1.5", + "version": "v1.1.6", "source": { "type": "git", "url": "https://github.com/Payfast/payfast-php-sdk.git", - "reference": "902b2cfa7318ad947ed0eba953eea4a3831c526a" + "reference": "015efcd2df3e580e023dae6e16c943328d38bb78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Payfast/payfast-php-sdk/zipball/902b2cfa7318ad947ed0eba953eea4a3831c526a", - "reference": "902b2cfa7318ad947ed0eba953eea4a3831c526a", + "url": "https://api.github.com/repos/Payfast/payfast-php-sdk/zipball/015efcd2df3e580e023dae6e16c943328d38bb78", + "reference": "015efcd2df3e580e023dae6e16c943328d38bb78", "shasum": "" }, "require": { @@ -8751,12 +8676,14 @@ "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9" + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.8" }, "type": "library", "autoload": { "psr-4": { - "Payfast\\": "lib/" + "PayFast\\": "lib/" } }, "notification-url": "https://packagist.org/downloads/", @@ -8778,10 +8705,10 @@ ], "support": { "issues": "https://github.com/Payfast/payfast-php-sdk/issues", - "source": "https://github.com/Payfast/payfast-php-sdk/tree/v1.1.5" + "source": "https://github.com/Payfast/payfast-php-sdk/tree/v1.1.6" }, "abandoned": true, - "time": "2023-10-11T09:57:01+00:00" + "time": "2024-02-28T09:54:10+00:00" }, { "name": "php-http/client-common", @@ -9336,21 +9263,21 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.8.0", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "fad452781b3d774e3337b0c0b245dd8e5a4455fc" + "reference": "153ae662783729388a584b4361f2545e4d841e3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/fad452781b3d774e3337b0c0b245dd8e5a4455fc", - "reference": "fad452781b3d774e3337b0c0b245dd8e5a4455fc", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", + "reference": "153ae662783729388a584b4361f2545e4d841e3c", "shasum": "" }, "require": { "doctrine/deprecations": "^1.0", - "php": "^7.4 || ^8.0", + "php": "^7.3 || ^8.0", "phpdocumentor/reflection-common": "^2.0", "phpstan/phpdoc-parser": "^1.13" }, @@ -9388,9 +9315,9 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.0" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2" }, - "time": "2024-01-11T11:49:22+00:00" + "time": "2024-02-23T11:10:43+00:00" }, { "name": "phpoffice/phpspreadsheet", @@ -9574,16 +9501,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "3.0.35", + "version": "3.0.37", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "4b1827beabce71953ca479485c0ae9c51287f2fe" + "reference": "cfa2013d0f68c062055180dd4328cc8b9d1f30b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/4b1827beabce71953ca479485c0ae9c51287f2fe", - "reference": "4b1827beabce71953ca479485c0ae9c51287f2fe", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/cfa2013d0f68c062055180dd4328cc8b9d1f30b8", + "reference": "cfa2013d0f68c062055180dd4328cc8b9d1f30b8", "shasum": "" }, "require": { @@ -9664,7 +9591,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.35" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.37" }, "funding": [ { @@ -9680,20 +9607,20 @@ "type": "tidelift" } ], - "time": "2023-12-29T01:59:53+00:00" + "time": "2024-03-03T02:14:58+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "1.25.0", + "version": "1.26.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240" + "reference": "231e3186624c03d7e7c890ec662b81e6b0405227" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bd84b629c8de41aa2ae82c067c955e06f1b00240", - "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/231e3186624c03d7e7c890ec662b81e6b0405227", + "reference": "231e3186624c03d7e7c890ec662b81e6b0405227", "shasum": "" }, "require": { @@ -9725,9 +9652,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.25.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.26.0" }, - "time": "2024-01-04T17:06:16+00:00" + "time": "2024-02-23T16:05:55+00:00" }, { "name": "pragmarx/google2fa", @@ -11576,26 +11503,26 @@ }, { "name": "socialiteproviders/manager", - "version": "v4.4.0", + "version": "v4.5.1", "source": { "type": "git", "url": "https://github.com/SocialiteProviders/Manager.git", - "reference": "df5e45b53d918ec3d689f014d98a6c838b98ed96" + "reference": "a67f194f0f4c4c7616c549afc697b78df9658d44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/df5e45b53d918ec3d689f014d98a6c838b98ed96", - "reference": "df5e45b53d918ec3d689f014d98a6c838b98ed96", + "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/a67f194f0f4c4c7616c549afc697b78df9658d44", + "reference": "a67f194f0f4c4c7616c549afc697b78df9658d44", "shasum": "" }, "require": { - "illuminate/support": "^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0", - "laravel/socialite": "~5.0", + "illuminate/support": "^8.0 || ^9.0 || ^10.0 || ^11.0", + "laravel/socialite": "^5.2", "php": "^8.0" }, "require-dev": { "mockery/mockery": "^1.2", - "phpunit/phpunit": "^6.0 || ^9.0" + "phpunit/phpunit": "^9.0" }, "type": "library", "extra": { @@ -11646,26 +11573,26 @@ "issues": "https://github.com/socialiteproviders/manager/issues", "source": "https://github.com/socialiteproviders/manager" }, - "time": "2023-08-27T23:46:34+00:00" + "time": "2024-02-17T08:58:03+00:00" }, { "name": "socialiteproviders/microsoft", - "version": "4.2.2", + "version": "4.2.3", "source": { "type": "git", "url": "https://github.com/SocialiteProviders/Microsoft.git", - "reference": "19bc79810d7319c466f38552546b2c233b634059" + "reference": "92c6f245a6175bcb51f4c7e0542b1e2891646edb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Microsoft/zipball/19bc79810d7319c466f38552546b2c233b634059", - "reference": "19bc79810d7319c466f38552546b2c233b634059", + "url": "https://api.github.com/repos/SocialiteProviders/Microsoft/zipball/92c6f245a6175bcb51f4c7e0542b1e2891646edb", + "reference": "92c6f245a6175bcb51f4c7e0542b1e2891646edb", "shasum": "" }, "require": { "ext-json": "*", - "php": "^7.4 || ^8.0", - "socialiteproviders/manager": "~4.0" + "php": "^8.0", + "socialiteproviders/manager": "^4.4" }, "type": "library", "autoload": { @@ -11696,20 +11623,20 @@ "issues": "https://github.com/socialiteproviders/providers/issues", "source": "https://github.com/socialiteproviders/providers" }, - "time": "2023-03-02T09:58:36+00:00" + "time": "2024-02-28T14:16:00+00:00" }, { "name": "spatie/laravel-data", - "version": "3.11.0", + "version": "3.11.2", "source": { "type": "git", "url": "https://github.com/spatie/laravel-data.git", - "reference": "e9cb66136974b6a6e290d6d2e2d484bac1727537" + "reference": "21b4d115a502dfd96ab2b11c62746325e9a28924" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-data/zipball/e9cb66136974b6a6e290d6d2e2d484bac1727537", - "reference": "e9cb66136974b6a6e290d6d2e2d484bac1727537", + "url": "https://api.github.com/repos/spatie/laravel-data/zipball/21b4d115a502dfd96ab2b11c62746325e9a28924", + "reference": "21b4d115a502dfd96ab2b11c62746325e9a28924", "shasum": "" }, "require": { @@ -11773,7 +11700,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-data/issues", - "source": "https://github.com/spatie/laravel-data/tree/3.11.0" + "source": "https://github.com/spatie/laravel-data/tree/3.11.2" }, "funding": [ { @@ -11781,7 +11708,7 @@ "type": "github" } ], - "time": "2023-12-21T12:31:34+00:00" + "time": "2024-02-22T08:34:10+00:00" }, { "name": "spatie/laravel-package-tools", @@ -12109,16 +12036,16 @@ }, { "name": "symfony/console", - "version": "v6.4.3", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e" + "reference": "0d9e4eb5ad413075624378f474c4167ea202de78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e", - "reference": "2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e", + "url": "https://api.github.com/repos/symfony/console/zipball/0d9e4eb5ad413075624378f474c4167ea202de78", + "reference": "0d9e4eb5ad413075624378f474c4167ea202de78", "shasum": "" }, "require": { @@ -12183,7 +12110,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.3" + "source": "https://github.com/symfony/console/tree/v6.4.4" }, "funding": [ { @@ -12199,7 +12126,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-02-22T20:27:10+00:00" }, { "name": "symfony/css-selector", @@ -12335,16 +12262,16 @@ }, { "name": "symfony/error-handler", - "version": "v6.4.3", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "6dc3c76a278b77f01d864a6005d640822c6f26a6" + "reference": "c725219bdf2afc59423c32793d5019d2a904e13a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/6dc3c76a278b77f01d864a6005d640822c6f26a6", - "reference": "6dc3c76a278b77f01d864a6005d640822c6f26a6", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/c725219bdf2afc59423c32793d5019d2a904e13a", + "reference": "c725219bdf2afc59423c32793d5019d2a904e13a", "shasum": "" }, "require": { @@ -12390,7 +12317,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.3" + "source": "https://github.com/symfony/error-handler/tree/v6.4.4" }, "funding": [ { @@ -12406,7 +12333,7 @@ "type": "tidelift" } ], - "time": "2024-01-29T15:40:36+00:00" + "time": "2024-02-22T20:27:10+00:00" }, { "name": "symfony/event-dispatcher", @@ -12693,16 +12620,16 @@ }, { "name": "symfony/http-client", - "version": "v6.4.3", + "version": "v6.4.5", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "a9034bc119fab8238f76cf49c770f3135f3ead86" + "reference": "f3c86a60a3615f466333a11fd42010d4382a82c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/a9034bc119fab8238f76cf49c770f3135f3ead86", - "reference": "a9034bc119fab8238f76cf49c770f3135f3ead86", + "url": "https://api.github.com/repos/symfony/http-client/zipball/f3c86a60a3615f466333a11fd42010d4382a82c7", + "reference": "f3c86a60a3615f466333a11fd42010d4382a82c7", "shasum": "" }, "require": { @@ -12766,7 +12693,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.4.3" + "source": "https://github.com/symfony/http-client/tree/v6.4.5" }, "funding": [ { @@ -12782,7 +12709,7 @@ "type": "tidelift" } ], - "time": "2024-01-29T15:01:07+00:00" + "time": "2024-03-02T12:45:30+00:00" }, { "name": "symfony/http-client-contracts", @@ -12864,16 +12791,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.4.3", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "5677bdf7cade4619cb17fc9e1e7b31ec392244a9" + "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5677bdf7cade4619cb17fc9e1e7b31ec392244a9", - "reference": "5677bdf7cade4619cb17fc9e1e7b31ec392244a9", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ebc713bc6e6f4b53f46539fc158be85dfcd77304", + "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304", "shasum": "" }, "require": { @@ -12921,7 +12848,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.3" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.4" }, "funding": [ { @@ -12937,20 +12864,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-02-08T15:01:18+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.3", + "version": "v6.4.5", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "9c6ec4e543044f7568a53a76ab1484ecd30637a2" + "reference": "f6947cb939d8efee137797382cb4db1af653ef75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9c6ec4e543044f7568a53a76ab1484ecd30637a2", - "reference": "9c6ec4e543044f7568a53a76ab1484ecd30637a2", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f6947cb939d8efee137797382cb4db1af653ef75", + "reference": "f6947cb939d8efee137797382cb4db1af653ef75", "shasum": "" }, "require": { @@ -12999,7 +12926,7 @@ "symfony/process": "^5.4|^6.0|^7.0", "symfony/property-access": "^5.4.5|^6.0.5|^7.0", "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.3|^7.0", + "symfony/serializer": "^6.4.4|^7.0.4", "symfony/stopwatch": "^5.4|^6.0|^7.0", "symfony/translation": "^5.4|^6.0|^7.0", "symfony/translation-contracts": "^2.5|^3", @@ -13034,7 +12961,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.3" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.5" }, "funding": [ { @@ -13050,7 +12977,7 @@ "type": "tidelift" } ], - "time": "2024-01-31T07:21:29+00:00" + "time": "2024-03-04T21:00:47+00:00" }, { "name": "symfony/intl", @@ -13136,16 +13063,16 @@ }, { "name": "symfony/mailer", - "version": "v6.4.3", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "74412c62f88a85a41b61f0b71ab0afcaad6f03ee" + "reference": "791c5d31a8204cf3db0c66faab70282307f4376b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/74412c62f88a85a41b61f0b71ab0afcaad6f03ee", - "reference": "74412c62f88a85a41b61f0b71ab0afcaad6f03ee", + "url": "https://api.github.com/repos/symfony/mailer/zipball/791c5d31a8204cf3db0c66faab70282307f4376b", + "reference": "791c5d31a8204cf3db0c66faab70282307f4376b", "shasum": "" }, "require": { @@ -13196,7 +13123,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.3" + "source": "https://github.com/symfony/mailer/tree/v6.4.4" }, "funding": [ { @@ -13212,20 +13139,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T15:01:07+00:00" + "time": "2024-02-03T21:33:47+00:00" }, { "name": "symfony/mailgun-mailer", - "version": "v6.4.3", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/mailgun-mailer.git", - "reference": "96d23bb0e773ecfc3fb8d21cdabfbb3f4d6abf04" + "reference": "8c018872b40ce050590b6d18cf741db0c8313435" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/96d23bb0e773ecfc3fb8d21cdabfbb3f4d6abf04", - "reference": "96d23bb0e773ecfc3fb8d21cdabfbb3f4d6abf04", + "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/8c018872b40ce050590b6d18cf741db0c8313435", + "reference": "8c018872b40ce050590b6d18cf741db0c8313435", "shasum": "" }, "require": { @@ -13265,7 +13192,7 @@ "description": "Symfony Mailgun Mailer Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailgun-mailer/tree/v6.4.3" + "source": "https://github.com/symfony/mailgun-mailer/tree/v6.4.4" }, "funding": [ { @@ -13281,7 +13208,7 @@ "type": "tidelift" } ], - "time": "2024-01-29T15:01:07+00:00" + "time": "2024-02-14T06:31:46+00:00" }, { "name": "symfony/mime", @@ -14231,16 +14158,16 @@ }, { "name": "symfony/postmark-mailer", - "version": "v6.4.3", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/postmark-mailer.git", - "reference": "59afae48341cf02fcab049eee368cbb9dc0b4481" + "reference": "2e73040e6b5ccf35025e86692a2080ef176a0d8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/postmark-mailer/zipball/59afae48341cf02fcab049eee368cbb9dc0b4481", - "reference": "59afae48341cf02fcab049eee368cbb9dc0b4481", + "url": "https://api.github.com/repos/symfony/postmark-mailer/zipball/2e73040e6b5ccf35025e86692a2080ef176a0d8d", + "reference": "2e73040e6b5ccf35025e86692a2080ef176a0d8d", "shasum": "" }, "require": { @@ -14281,7 +14208,7 @@ "description": "Symfony Postmark Mailer Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/postmark-mailer/tree/v6.4.3" + "source": "https://github.com/symfony/postmark-mailer/tree/v6.4.4" }, "funding": [ { @@ -14297,20 +14224,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-02-09T11:00:58+00:00" }, { "name": "symfony/process", - "version": "v6.4.3", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "31642b0818bfcff85930344ef93193f8c607e0a3" + "reference": "710e27879e9be3395de2b98da3f52a946039f297" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/31642b0818bfcff85930344ef93193f8c607e0a3", - "reference": "31642b0818bfcff85930344ef93193f8c607e0a3", + "url": "https://api.github.com/repos/symfony/process/zipball/710e27879e9be3395de2b98da3f52a946039f297", + "reference": "710e27879e9be3395de2b98da3f52a946039f297", "shasum": "" }, "require": { @@ -14342,7 +14269,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.3" + "source": "https://github.com/symfony/process/tree/v6.4.4" }, "funding": [ { @@ -14358,7 +14285,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-02-20T12:31:00+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -14451,16 +14378,16 @@ }, { "name": "symfony/routing", - "version": "v6.4.3", + "version": "v6.4.5", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "3b2957ad54902f0f544df83e3d58b38d7e8e5842" + "reference": "7fe30068e207d9c31c0138501ab40358eb2d49a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/3b2957ad54902f0f544df83e3d58b38d7e8e5842", - "reference": "3b2957ad54902f0f544df83e3d58b38d7e8e5842", + "url": "https://api.github.com/repos/symfony/routing/zipball/7fe30068e207d9c31c0138501ab40358eb2d49a4", + "reference": "7fe30068e207d9c31c0138501ab40358eb2d49a4", "shasum": "" }, "require": { @@ -14514,7 +14441,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.3" + "source": "https://github.com/symfony/routing/tree/v6.4.5" }, "funding": [ { @@ -14530,7 +14457,7 @@ "type": "tidelift" } ], - "time": "2024-01-30T13:55:02+00:00" + "time": "2024-02-27T12:33:30+00:00" }, { "name": "symfony/service-contracts", @@ -14616,16 +14543,16 @@ }, { "name": "symfony/string", - "version": "v6.4.3", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "7a14736fb179876575464e4658fce0c304e8c15b" + "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/7a14736fb179876575464e4658fce0c304e8c15b", - "reference": "7a14736fb179876575464e4658fce0c304e8c15b", + "url": "https://api.github.com/repos/symfony/string/zipball/4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", + "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", "shasum": "" }, "require": { @@ -14682,7 +14609,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.3" + "source": "https://github.com/symfony/string/tree/v6.4.4" }, "funding": [ { @@ -14698,20 +14625,20 @@ "type": "tidelift" } ], - "time": "2024-01-25T09:26:29+00:00" + "time": "2024-02-01T13:16:41+00:00" }, { "name": "symfony/translation", - "version": "v6.4.3", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "637c51191b6b184184bbf98937702bcf554f7d04" + "reference": "bce6a5a78e94566641b2594d17e48b0da3184a8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/637c51191b6b184184bbf98937702bcf554f7d04", - "reference": "637c51191b6b184184bbf98937702bcf554f7d04", + "url": "https://api.github.com/repos/symfony/translation/zipball/bce6a5a78e94566641b2594d17e48b0da3184a8e", + "reference": "bce6a5a78e94566641b2594d17e48b0da3184a8e", "shasum": "" }, "require": { @@ -14777,7 +14704,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.3" + "source": "https://github.com/symfony/translation/tree/v6.4.4" }, "funding": [ { @@ -14793,7 +14720,7 @@ "type": "tidelift" } ], - "time": "2024-01-29T13:11:52+00:00" + "time": "2024-02-20T13:16:58+00:00" }, { "name": "symfony/translation-contracts", @@ -14949,16 +14876,16 @@ }, { "name": "symfony/validator", - "version": "v6.4.3", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "9c1d8bb4edce5304fcefca7923741085f1ca5b60" + "reference": "1cf92edc9a94d16275efef949fa6748d11cc8f47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/9c1d8bb4edce5304fcefca7923741085f1ca5b60", - "reference": "9c1d8bb4edce5304fcefca7923741085f1ca5b60", + "url": "https://api.github.com/repos/symfony/validator/zipball/1cf92edc9a94d16275efef949fa6748d11cc8f47", + "reference": "1cf92edc9a94d16275efef949fa6748d11cc8f47", "shasum": "" }, "require": { @@ -15025,7 +14952,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.4.3" + "source": "https://github.com/symfony/validator/tree/v6.4.4" }, "funding": [ { @@ -15041,20 +14968,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T15:01:07+00:00" + "time": "2024-02-22T20:27:10+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.3", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "0435a08f69125535336177c29d56af3abc1f69da" + "reference": "b439823f04c98b84d4366c79507e9da6230944b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0435a08f69125535336177c29d56af3abc1f69da", - "reference": "0435a08f69125535336177c29d56af3abc1f69da", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b439823f04c98b84d4366c79507e9da6230944b1", + "reference": "b439823f04c98b84d4366c79507e9da6230944b1", "shasum": "" }, "require": { @@ -15110,7 +15037,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.3" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.4" }, "funding": [ { @@ -15126,7 +15053,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:53:30+00:00" + "time": "2024-02-15T11:23:52+00:00" }, { "name": "symfony/yaml", @@ -15876,16 +15803,16 @@ "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v3.10.5", + "version": "v3.10.6", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "d1a48965f2b25a6cec2eea07d719b568a37c9a88" + "reference": "1fcb37307ebb32207dce16fa160a92b14d8b671f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/d1a48965f2b25a6cec2eea07d719b568a37c9a88", - "reference": "d1a48965f2b25a6cec2eea07d719b568a37c9a88", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/1fcb37307ebb32207dce16fa160a92b14d8b671f", + "reference": "1fcb37307ebb32207dce16fa160a92b14d8b671f", "shasum": "" }, "require": { @@ -15899,7 +15826,7 @@ "require-dev": { "mockery/mockery": "^1.3.3", "orchestra/testbench-dusk": "^5|^6|^7|^8|^9", - "phpunit/phpunit": "^8.5.30|^9.0", + "phpunit/phpunit": "^9.6|^10.5", "squizlabs/php_codesniffer": "^3.5" }, "type": "library", @@ -15944,7 +15871,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.10.5" + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.10.6" }, "funding": [ { @@ -15956,7 +15883,7 @@ "type": "github" } ], - "time": "2024-02-15T10:45:45+00:00" + "time": "2024-03-01T14:41:13+00:00" }, { "name": "barryvdh/laravel-ide-helper", @@ -16684,16 +16611,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.49.0", + "version": "v3.51.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "8742f7aa6f72a399688b65e4f58992c2d4681fc2" + "reference": "127fa74f010da99053e3f5b62672615b72dd6efd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/8742f7aa6f72a399688b65e4f58992c2d4681fc2", - "reference": "8742f7aa6f72a399688b65e4f58992c2d4681fc2", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/127fa74f010da99053e3f5b62672615b72dd6efd", + "reference": "127fa74f010da99053e3f5b62672615b72dd6efd", "shasum": "" }, "require": { @@ -16703,7 +16630,7 @@ "ext-json": "*", "ext-tokenizer": "*", "php": "^7.4 || ^8.0", - "sebastian/diff": "^4.0 || ^5.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0", "symfony/console": "^5.4 || ^6.0 || ^7.0", "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", @@ -16724,7 +16651,8 @@ "php-cs-fixer/accessible-object": "^1.1", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4", - "phpunit/phpunit": "^9.6 || ^10.5.5", + "phpunit/phpunit": "^9.6 || ^10.5.5 || ^11.0.2", + "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0", "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "suggest": { @@ -16763,7 +16691,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.49.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.51.0" }, "funding": [ { @@ -16771,7 +16699,7 @@ "type": "github" } ], - "time": "2024-02-02T00:41:40+00:00" + "time": "2024-02-28T19:50:06+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -16885,16 +16813,16 @@ }, { "name": "larastan/larastan", - "version": "v2.9.0", + "version": "v2.9.2", "source": { "type": "git", "url": "https://github.com/larastan/larastan.git", - "reference": "35fa9cbe1895e76215bbe74571a344f2705fbe01" + "reference": "a79b46b96060504b400890674b83f66aa7f5db6d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/larastan/larastan/zipball/35fa9cbe1895e76215bbe74571a344f2705fbe01", - "reference": "35fa9cbe1895e76215bbe74571a344f2705fbe01", + "url": "https://api.github.com/repos/larastan/larastan/zipball/a79b46b96060504b400890674b83f66aa7f5db6d", + "reference": "a79b46b96060504b400890674b83f66aa7f5db6d", "shasum": "" }, "require": { @@ -16911,6 +16839,7 @@ "phpstan/phpstan": "^1.10.50" }, "require-dev": { + "doctrine/coding-standard": "^12.0", "nikic/php-parser": "^4.17.1", "orchestra/canvas": "^7.11.1 || ^8.11.0 || ^9.0.0", "orchestra/testbench": "^7.33.0 || ^8.13.0 || ^9.0.0", @@ -16962,7 +16891,7 @@ ], "support": { "issues": "https://github.com/larastan/larastan/issues", - "source": "https://github.com/larastan/larastan/tree/v2.9.0" + "source": "https://github.com/larastan/larastan/tree/v2.9.2" }, "funding": [ { @@ -16982,7 +16911,7 @@ "type": "patreon" } ], - "time": "2024-02-13T11:49:22+00:00" + "time": "2024-02-27T03:16:03+00:00" }, { "name": "maximebf/debugbar", @@ -17290,20 +17219,21 @@ }, { "name": "phar-io/manifest", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", @@ -17344,9 +17274,15 @@ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, - "time": "2021-07-20T11:28:43+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" }, { "name": "phar-io/version", @@ -17489,16 +17425,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.58", + "version": "1.10.59", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "a23518379ec4defd9e47cbf81019526861623ec2" + "reference": "e607609388d3a6d418a50a49f7940e8086798281" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a23518379ec4defd9e47cbf81019526861623ec2", - "reference": "a23518379ec4defd9e47cbf81019526861623ec2", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e607609388d3a6d418a50a49f7940e8086798281", + "reference": "e607609388d3a6d418a50a49f7940e8086798281", "shasum": "" }, "require": { @@ -17547,20 +17483,20 @@ "type": "tidelift" } ], - "time": "2024-02-12T20:02:57+00:00" + "time": "2024-02-20T13:59:13+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.11", + "version": "10.1.12", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "78c3b7625965c2513ee96569a4dbb62601784145" + "reference": "842f72662d6b9edda84c4b6f13885fd9cd53dc63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/78c3b7625965c2513ee96569a4dbb62601784145", - "reference": "78c3b7625965c2513ee96569a4dbb62601784145", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/842f72662d6b9edda84c4b6f13885fd9cd53dc63", + "reference": "842f72662d6b9edda84c4b6f13885fd9cd53dc63", "shasum": "" }, "require": { @@ -17617,7 +17553,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.11" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.12" }, "funding": [ { @@ -17625,7 +17561,7 @@ "type": "github" } ], - "time": "2023-12-21T15:38:30+00:00" + "time": "2024-03-02T07:22:05+00:00" }, { "name": "phpunit/php-file-iterator", @@ -17872,16 +17808,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.10", + "version": "10.5.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "50b8e314b6d0dd06521dc31d1abffa73f25f850c" + "reference": "0d968f6323deb3dbfeba5bfd4929b9415eb7a9a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/50b8e314b6d0dd06521dc31d1abffa73f25f850c", - "reference": "50b8e314b6d0dd06521dc31d1abffa73f25f850c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0d968f6323deb3dbfeba5bfd4929b9415eb7a9a4", + "reference": "0d968f6323deb3dbfeba5bfd4929b9415eb7a9a4", "shasum": "" }, "require": { @@ -17953,7 +17889,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.10" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.11" }, "funding": [ { @@ -17969,20 +17905,20 @@ "type": "tidelift" } ], - "time": "2024-02-04T09:07:51+00:00" + "time": "2024-02-25T14:05:00+00:00" }, { "name": "sebastian/cli-parser", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae" + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae", - "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", "shasum": "" }, "require": { @@ -18017,7 +17953,8 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0" + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" }, "funding": [ { @@ -18025,7 +17962,7 @@ "type": "github" } ], - "time": "2023-02-03T06:58:15+00:00" + "time": "2024-03-02T07:12:49+00:00" }, { "name": "sebastian/code-unit", @@ -18275,16 +18212,16 @@ }, { "name": "sebastian/diff", - "version": "5.1.0", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f" + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/fbf413a49e54f6b9b17e12d900ac7f6101591b7f", - "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", "shasum": "" }, "require": { @@ -18292,7 +18229,7 @@ }, "require-dev": { "phpunit/phpunit": "^10.0", - "symfony/process": "^4.2 || ^5" + "symfony/process": "^6.4" }, "type": "library", "extra": { @@ -18330,7 +18267,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1.0" + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" }, "funding": [ { @@ -18338,7 +18275,7 @@ "type": "github" } ], - "time": "2023-12-22T10:55:06+00:00" + "time": "2024-03-02T07:15:17+00:00" }, { "name": "sebastian/environment", @@ -18406,16 +18343,16 @@ }, { "name": "sebastian/exporter", - "version": "5.1.1", + "version": "5.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc" + "reference": "955288482d97c19a372d3f31006ab3f37da47adf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc", - "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf", "shasum": "" }, "require": { @@ -18472,7 +18409,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1" + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" }, "funding": [ { @@ -18480,20 +18417,20 @@ "type": "github" } ], - "time": "2023-09-24T13:22:09+00:00" + "time": "2024-03-02T07:17:12+00:00" }, { "name": "sebastian/global-state", - "version": "6.0.1", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4" + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4", - "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", "shasum": "" }, "require": { @@ -18527,14 +18464,14 @@ } ], "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" }, "funding": [ { @@ -18542,7 +18479,7 @@ "type": "github" } ], - "time": "2023-07-19T07:19:23+00:00" + "time": "2024-03-02T07:19:19+00:00" }, { "name": "sebastian/lines-of-code", @@ -19394,16 +19331,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.2", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { @@ -19432,7 +19369,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.2" + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" }, "funding": [ { @@ -19440,7 +19377,7 @@ "type": "github" } ], - "time": "2023-11-20T00:12:19+00:00" + "time": "2024-03-03T12:36:25+00:00" } ], "aliases": [], diff --git a/tests/Feature/Export/ReportCsvGenerationTest.php b/tests/Feature/Export/ReportCsvGenerationTest.php index 397e00c321de..2db78dcd8f0e 100644 --- a/tests/Feature/Export/ReportCsvGenerationTest.php +++ b/tests/Feature/Export/ReportCsvGenerationTest.php @@ -501,6 +501,7 @@ class ReportCsvGenerationTest extends TestCase // 'start_date' => 'bail|required_if:date_range,custom|nullable|date', 'report_keys' => [], 'send_email' => false, + 'include_deleted' => false, // 'status' => 'sometimes|string|nullable|in:all,draft,sent,viewed,paid,unpaid,overdue', ]; @@ -547,6 +548,7 @@ class ReportCsvGenerationTest extends TestCase 'date_range' => 'all', 'report_keys' => ["vendor.name", "vendor.city", "vendor.number"], 'send_email' => false, + 'include_deleted' => false, ]; $response = $this->withHeaders([ @@ -638,6 +640,7 @@ class ReportCsvGenerationTest extends TestCase 'task.custom_value4', ], 'send_email' => false, + 'include_deleted' => false, ]; $response = $this->withHeaders([ @@ -792,6 +795,7 @@ class ReportCsvGenerationTest extends TestCase 'date_range' => 'all', 'report_keys' => [], 'send_email' => false, + 'include_deleted' => false, ]; $response = $this->withHeaders([ @@ -873,6 +877,7 @@ class ReportCsvGenerationTest extends TestCase "client.paid_to_date" ], 'send_email' => false, + 'include_deleted' => false, ]; $response = $this->withHeaders([ From 633e5f2cb4b7d42b9341dce989389ec3567ee1e8 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 5 Mar 2024 14:21:34 +1100 Subject: [PATCH 04/21] Fixes for tests --- tests/Feature/Export/ReportPreviewTest.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/Feature/Export/ReportPreviewTest.php b/tests/Feature/Export/ReportPreviewTest.php index 3aaffd171931..0b858f039a76 100644 --- a/tests/Feature/Export/ReportPreviewTest.php +++ b/tests/Feature/Export/ReportPreviewTest.php @@ -70,6 +70,7 @@ class ReportPreviewTest extends TestCase 'send_email' => false, 'date_range' => 'all', 'report_keys' => [], + 'include_deleted' => false, ]; $response = $this->withHeaders([ @@ -101,6 +102,7 @@ class ReportPreviewTest extends TestCase 'send_email' => false, 'date_range' => 'all', 'report_keys' => [], + 'include_deleted' => false, ]; $response = $this->withHeaders([ @@ -132,6 +134,7 @@ class ReportPreviewTest extends TestCase 'send_email' => false, 'date_range' => 'all', 'report_keys' => [], + 'include_deleted' => false, ]; $response = $this->withHeaders([ @@ -164,6 +167,7 @@ class ReportPreviewTest extends TestCase 'send_email' => false, 'date_range' => 'all', 'report_keys' => [], + 'include_deleted' => false, ]; $response = $this->withHeaders([ @@ -197,6 +201,7 @@ class ReportPreviewTest extends TestCase 'send_email' => false, 'date_range' => 'all', 'report_keys' => [], + 'include_deleted' => false, ]; $response = $this->withHeaders([ @@ -231,6 +236,7 @@ class ReportPreviewTest extends TestCase 'send_email' => false, 'date_range' => 'all', 'report_keys' => [], + 'include_deleted' => false, ]; $response = $this->withHeaders([ @@ -261,6 +267,7 @@ class ReportPreviewTest extends TestCase 'send_email' => false, 'date_range' => 'all', 'report_keys' => [], + 'include_deleted' => false, ]; $response = $this->withHeaders([ @@ -291,6 +298,7 @@ class ReportPreviewTest extends TestCase 'send_email' => false, 'date_range' => 'all', 'report_keys' => [], + 'include_deleted' => false, ]; $response = $this->withHeaders([ @@ -320,6 +328,7 @@ class ReportPreviewTest extends TestCase 'send_email' => false, 'date_range' => 'all', 'report_keys' => [], + 'include_deleted' => false, ]; $response = $this->withHeaders([ @@ -351,6 +360,7 @@ class ReportPreviewTest extends TestCase 'send_email' => false, 'date_range' => 'all', 'report_keys' => [], + 'include_deleted' => false, ]; $response = $this->withHeaders([ @@ -375,6 +385,7 @@ class ReportPreviewTest extends TestCase 'send_email' => false, 'date_range' => 'all', 'report_keys' => [], + 'include_deleted' => false, ]; $response = $this->withHeaders([ @@ -387,6 +398,7 @@ class ReportPreviewTest extends TestCase 'send_email' => false, 'date_range' => 'all', 'report_keys' => ['client.name','client.balance'], + 'include_deleted' => false, ]; @@ -408,6 +420,7 @@ class ReportPreviewTest extends TestCase 'send_email' => false, 'date_range' => 'all', 'report_keys' => [], + 'include_deleted' => false, ]; $response = $this->withHeaders([ @@ -420,6 +433,7 @@ class ReportPreviewTest extends TestCase 'send_email' => false, 'date_range' => 'all', 'report_keys' => ['client.name','client.balance','contact.email'], + 'include_deleted' => false, ]; @@ -439,6 +453,7 @@ class ReportPreviewTest extends TestCase 'send_email' => false, 'date_range' => 'all', 'report_keys' => [], + 'include_deleted' => false, ]; $response = $this->withHeaders([ @@ -466,6 +481,7 @@ class ReportPreviewTest extends TestCase 'send_email' => false, 'date_range' => 'all', 'report_keys' => [], + 'include_deleted' => false, ]; $p = (new PreviewReport($this->company, $data, CreditExport::class, '123'))->handle(); @@ -484,6 +500,7 @@ class ReportPreviewTest extends TestCase 'send_email' => false, 'date_range' => 'all', 'report_keys' => [], + 'include_deleted' => false, ]; $response = $this->withHeaders([ From 6859de6e8c65ce5dde041c17a2e6995a32348302 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 5 Mar 2024 15:32:32 +1100 Subject: [PATCH 05/21] Additional logging around email switching --- app/Jobs/Mail/NinjaMailerJob.php | 2 ++ app/Services/Email/Email.php | 1 + 2 files changed, 3 insertions(+) diff --git a/app/Jobs/Mail/NinjaMailerJob.php b/app/Jobs/Mail/NinjaMailerJob.php index 0330156f7419..2ec5c62c7214 100644 --- a/app/Jobs/Mail/NinjaMailerJob.php +++ b/app/Jobs/Mail/NinjaMailerJob.php @@ -286,6 +286,8 @@ class NinjaMailerJob implements ShouldQueue return $this; } } catch(\Exception $e) { + + nlog("problem switching outlook driver - hosted"); nlog($e->getMessage()); } } diff --git a/app/Services/Email/Email.php b/app/Services/Email/Email.php index a567839883d9..7bd64c4e88ab 100644 --- a/app/Services/Email/Email.php +++ b/app/Services/Email/Email.php @@ -512,6 +512,7 @@ class Email implements ShouldQueue return $this; } } catch(\Exception $e) { + nlog("problem switching outlook driver - hosted"); nlog($e->getMessage()); } } From 6f80c6fab8192f5e48ee6e8f065fba811e7b901d Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 5 Mar 2024 16:06:02 +1100 Subject: [PATCH 06/21] Updates for custom designs --- app/Jobs/Mail/NinjaMailerJob.php | 8 +++++++- app/Providers/RouteServiceProvider.php | 8 ++++---- app/Services/Email/Email.php | 8 +++++++- config/services.php | 5 ++++- .../views/email/template/admin_premium.blade.php.enc | 2 +- .../views/email/template/client_premium.blade.php.enc | 2 +- 6 files changed, 24 insertions(+), 9 deletions(-) diff --git a/app/Jobs/Mail/NinjaMailerJob.php b/app/Jobs/Mail/NinjaMailerJob.php index 2ec5c62c7214..7932c01ec79c 100644 --- a/app/Jobs/Mail/NinjaMailerJob.php +++ b/app/Jobs/Mail/NinjaMailerJob.php @@ -279,9 +279,15 @@ class NinjaMailerJob implements ShouldQueue $this->mailer = 'postmark'; $this->client_postmark_secret = config('services.postmark-outlook.token'); + if (property_exists($this->nmo->settings, 'email_from_name') && strlen($this->nmo->settings->email_from_name) > 1) { + $email_from_name = $this->nmo->settings->email_from_name; + } else { + $email_from_name = $this->company->present()->name(); + } + $this->nmo ->mailable - ->from('maildelivery@invoice.services', 'Invoice Ninja'); + ->from(config('services.postmark-outlook.from.address'), $email_from_name); return $this; } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 75e6ac6a7241..967858f658ef 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -36,11 +36,11 @@ class RouteServiceProvider extends ServiceProvider { parent::boot(); - if (Ninja::isHosted() && !config('ninja.testvars.travis')) { - app('router')->aliasMiddleware('throttle', ThrottleRequestsWithPredis::class); - } else { + // if (Ninja::isHosted() && !config('ninja.testvars.travis')) { + // app('router')->aliasMiddleware('throttle', ThrottleRequestsWithPredis::class); + // } else { app('router')->aliasMiddleware('throttle', ThrottleRequests::class); - } + // } Route::bind('task_scheduler', function ($value) { if (is_numeric($value)) { diff --git a/app/Services/Email/Email.php b/app/Services/Email/Email.php index 7bd64c4e88ab..d0e2da2d39d8 100644 --- a/app/Services/Email/Email.php +++ b/app/Services/Email/Email.php @@ -503,13 +503,19 @@ class Email implements ShouldQueue $server = $dns[0]["target"]; if(stripos($server, "outlook.com") !== false) { + if (property_exists($this->email_object->settings, 'email_from_name') && strlen($this->email_object->settings->email_from_name) > 1) { + $email_from_name = $this->email_object->settings->email_from_name; + } else { + $email_from_name = $this->company->present()->name(); + } $this->mailer = 'postmark'; $this->client_postmark_secret = config('services.postmark-outlook.token'); $this->mailable - ->from('maildelivery@invoice.services', 'Invoice Ninja'); + ->from(config('services.postmark-outlook.from.address'), $email_from_name); return $this; + } } catch(\Exception $e) { nlog("problem switching outlook driver - hosted"); diff --git a/config/services.php b/config/services.php index b9218c37270d..e8f12e34cb4d 100644 --- a/config/services.php +++ b/config/services.php @@ -35,7 +35,10 @@ return [ ], 'postmark-outlook' => [ - 'token' => env('POSTMARK_OUTLOOK_SECRET','') + 'token' => env('POSTMARK_OUTLOOK_SECRET',''), + 'from' => [ + 'address' => env('POSTMARK_OUTLOOK_FROM_ADDRESS', '') + ], ], 'microsoft' => [ diff --git a/resources/views/email/template/admin_premium.blade.php.enc b/resources/views/email/template/admin_premium.blade.php.enc index 3b6e5ed158f7..10c67febf24f 100644 --- a/resources/views/email/template/admin_premium.blade.php.enc +++ b/resources/views/email/template/admin_premium.blade.php.enc @@ -1 +1 @@ -eyJpdiI6ImZlSVRDdGcxMFhqTEppdkVqTWh4eFE9PSIsInZhbHVlIjoiTlNzWFRXRlkvc1BFL3hiZnBzbWZqblVvcnpSRzl5OVdodTF6UUthd3RaWXRiakNiYjVlMUR5SlovNUR4cmRvdW90dDBLNE85RFRhbGc4VFh4VnpDTjRvZTlCQWFvZldwSkhDQitMUExZOXZWVEJlK1hWMjJGbWRrUFlKQ291UXAyWnZxTlpXbFViMlpYQ09OK0pTVkQ1NVV1MHdzMG9iWTE2VHhhMCtRK21HbGpheGdVNGR4TUorUklWcGlRaGFFLy9UQ1doWFMvdjNkVlMrNWVrb3B1NlQ2VHBqWjI0U1B2eEwwV3haZFNmbW5pVE8xcVZKeG9zdzlKTkZBWnE3b2g2b0lDS0dvbjh5M3haVDNyWVY2cnRFZERDS01KRmNXeTY0VWxIN0RDa3VZemZabnJ0M1BndTZLci9qREFtZmtZUGZDVWdFVjcxeDk2SUNTTmUwekpQUnIxajBVU0x4UUt4SjJiUkVpeUhiNlNxQW03SSt5WWhDRFlwc3JBTEVBMUo2NWN4UGpSYWpkNDFVL1RHU3FDY2pMY01nSUhqMlk2c1p3eWg3VTc3WTFhL3dFcWJBMyszdDcyQ3U0K084T2VIa2E2dTNJQzRFVDNmeXhVck1zbEptN2R0a3NTQk9URkFpbVUxWXYyekZoNUxWUG9OZDEzenljNVNDQVY3N1pNRXhWd1NEV01ySnpIaUFaSlg5dEhxait1ZFkzZmJad1l2QnhrckFDQ0gyMW14OThJNFlFUHptWGRVN1FDdVJtdnlYZ25ZbWZtVnNFaExjSmZGZGNBVlhOY2pyRDlzMVZzVjFKQWVMdGt5a3NEWnhaTDVVblYvQ2lWcWxLYTRBdnVhd0doZ3piYXhERVlwVmJoSGlRTW1TUzgveHNLWGZPeDJ5TEtNWmwrQjNSQWZjSWJkZUc2aDdlT3BKMHdibGdPN1hZbjR2eDBnSUFTRGszWlVKc2ZLOTZmOUd1eFdBRytxWk14REVianJheGhFUEZjSytLYTBUSWdMQlNWaU9PQ1VXMk1BZmVVc2lyL21Xc3Zxc2dtM29IaXFKcWxXU1EyTWROeWJCZzJnSEkxeGtVTnAwWWlROFpJakFqWHdqdkdTNzQ2cmx5MUFKemR5Q1JVRFYzY2xPRU8vRDRWbmpwSURaQU1vNnAzc0lKaTJqRmsyTzJXYUliVGhXcUhUOVJNalhKLzcxQWNjVDhCQ2dKTmVFeWhsSE93cXJXMEltblVaS3RLSkZmM3U5TzlQMUtkUEkvSlJTQ3FJWktXUitJcWY5ek1UbzNjTUR1djlzWkc1WGxGUjVNQ3BlVjM2YkZud3RJSTloZ0tmL0VEYjhkNGc0RmJkSFdZeFIxK1FLWjgrSTBuZDg0eUlpRHR1QjJmMmdlL0Y4YndnVitIVDRNYU8rNy80aG1aYU1LOExPNk04SHVxWGZpZSszMTJybFBrUHlrZlBnZzRrc2VpTTFRRzlwakxvZ0YvRjd2NVkydzdJdWZsNWVVd2Q5NFFXdUw5bmRSMEQzdzg4dXBlZ3ltQTUzakxmZFRlTUNWNGJydzE3N21qbjA0WDlocXZ5dWZHMzJSNGZ1YTF0NjlFcmtkeEpaY2Zsa0FsQnlxODZBYkpGc2RLWC80WHVEL1oraERwS2p0M3MrNHd0R0VoQ05lTWpRV0Y5UVEyYjVRVjAzSWZZN3hwbExrTi9DbjlJZTFSMDFqUDhmV0hMTWp4Q01sZ2tKYXB6dDJ3d2duaXp5NFBucW1UdHVVU01TaEZDeFEwWFF4UElWdEttWGtaUG8wK2dwaVMyRU1GTVIxZ21PQmwzMWhKVnZDbVBWKzNiTW1CbHhxZ0FMWTZGY2ZrNnc0dDBaYXRsTk9pajN3dUt0QnlibG9NeUFsUE0xa3JOa0hGcTNuQkNybEJsNmtnbzJNdFNBek1zeG1KNE1neUtPYWtrQlQyOENwQURKMDBIWU1DS0xxenFpalJMM2RqZjI2VkJIU1dzOFpBbERjMVVQeUhzRzNBY2JwZDBieHYrL0doNncwL01YUjZFTWk4UlNhVHpRbCtqeStCOEpBakswZDV5YTNvTTFuOW1ON0w1QXUwT2NYdm1VdVM4R0EzTXlHaXMxTWRjcXZyVDJCVmpyOHJxY3YyT055WUJ3QTVnYVhYYUdkNmYvK1VqZ0lYTm84bDZBVlFIOWhiaDZadlRSVnIwbXArQU5DdmlPRTM3VjhNRVQ2VUk5V1hhRVp4dlFINldWY0MzSjc2UGRsSkxBMDBxTHBXcUdSUmpYTHg4Uzd1K0tmeCsrOGlqM1JHeWtpaUNyd3QzeGVRZC9hYTBQdXgxUjhMK2VtOGtaUkVmN3ovQ0NiMFVTWjJHL0hzL1RlUWJRMklHVUtqK2x6QXZWZjBwdytieEs5STNmaG5mekloTldWOVRHd21pdlZXRWUvakpwazZ0cUtrMFF1dzYydzBBSXFMQytycEpDMjM0bjlLWUYrQXQ5cm1aUGdDcFJsZkR4Y0E2QUNmRTRwY0kvdGNFQnl5OFBMYnl2eHpTOGh2Y2JUNEg2Ym94K1FUc2NXS3NPMU5McEdLcGw5cCtYdTZEeUFRUVZzcGlpeGNkbzhXUzNzWnYrMW90MnExVndPMXJ5cEwxWGkwUGlYYTlqSmlYeUpGVkhWc051amUzeDcvcVdqaTZTayswNTduNWhxNkd4SllxajEvTS9rTkMwYjJNdWs5Z1lHd1RoYTVPZmpud3ZoN0hoM2hDUmx3c0t0bkhCN0QwWENuQ3FDbmlXeDB1WU45aGJaWm1rajVDa21LMk9aZVNwOHU0djdqOFhueisxKy9BeG1vbE9IbmhFZ3k3TmJja1IrcUxDSm9aS0JMYkVnbWoyd2J3NC9KSUw0NVpZa3FzeE1Ib1drK25POS9nd0g1QXNtMGFhR3hXcDZzMTdGQW96SkIzVHFlUVo0RWppTTFlbzVCeXRuMDFScUROY0l5a21kLzJjdWQwc2lqekY2NVFNU0VFYjR6RU0vNmlIOGpvRzRsbTZKL2hzT0R6MnRTZGhJUkVrbk5OKzNWaTZob3kwZzFyV0VyK2xnZG41MWlnSXN6R1hzQXpyaXYvY3VQeXc3TmNMMnJteDNUclM2ZTdpTHFJYmdkRFhsUHRtRmh1bkM2V0tJdkNaZ3VOc3djSktISjBOMHRIWWJTRHdhS3hoWTh2Wk5Dc283c0UvNnpUYTM3MlBDcGk0dkZ3eVpMSVlMMEFRVVRJQXhyMkVsZVc0azdwcUk5WjJjdGI3WUZpMm9BNGd5ZzBIUksyYUFJOFpVRWd6Y1puWUdnN0ZWNkpoVnp3Y3FaK0ZZb3ZGMVhDWitXbm5seUlkWFRHcWtYNnkzeVlwSHBUVkhRYkxMdDNPam9lUE9WaU8wNjZ5a0xTMmtYdHp2MXFJZFE1eXRLU3Q3NFN6RDZtZ1hTZXYyS2VaWTBMaUJYbVJOdTBlc2twZVRDWWw3VkdKU0lkZ1MwOHQrLzMyY2kvVnpQRHgxNjJXeC81Z05sWTBSRVNmV0lKV2FRY3NGQ0Y3V3VTTkpYTThaeVpocHlRZzhMbW9mSnE2U3dSU0FFQ0lIVVE0dDc4SjdndHlpc05YeWphMEsrM1U3SVdxMk5sQks2L2xPKzdFbWdVMXhWR1o1SmIvWUpwcVZkdmdmOStOWVMvOWpQM3FCV1Z1OE5hMDZpeEhTMVlIeFNmQW9mbTV5MUxyVXB0VFhxdk5sZ2dFbkZoYWxGTFhuaTRVd25yeVNoTS82OU53ajRyRnNGeWJHV2YrUjYzbVZNQkNuS3RTK0lYbXVvZGdRTS9WQS80VnRhQzhiUzlMNjByYUhVOVA3SmZQa05WUDVLTk4rZnJTY0dSSWwrMEJhQnhVZ3c2MnBSakJkMGFlWU9VNFhPWWgydyt6eUVhRVByOWk5WHp2VFhnckRuampXT2IyNjM2U0QxYStBSTlibDRNSlhmZlFoL3JQbXRrRHdrdGFLbWk2a0NDNFEyTXI3ZW1xUUlrU0RwQTd3YVg2cWxvQ3BJNlBabFB1WXlTMG10QytaMWtUalNsc2tBSzlkc0VjeGwyVUw1eHN5b2hLYTFYaFZHQVNzdUJoVjBPZkRTOUpiSTQzdTVlZlA1Z2VXdy9OVnN0NFlUODlmM1hrQnVpdnhkUlo2Z09iRmRaa2NxNW9MODdkeCtScXJGS2JyYWRIdGh1amFyWE5peGhZcWlBRjhzMWdObHdGNzZpZzd1Mnd1Smc0WnFHTkkxWk5idW9kSG05UFBYSzhZak85UUkxd21CMGo5bkJkN0FwZzBUcFJ3NjVBVG0vRDBDU3F3WUtaYmw3eXM4UXBzemRtbWUrU2FYR1IxTXhwMTBHYWpuUUZjaTlvZjlLSGw4b2pKdEpkdFpya1VkQitFSGtWcGNSQ09QdSsrMFJ4N1FzNEg5aDMwaFQ5eGYrWjVrc2JTdzA3c3NwNzVjaXZaUzNUeVZrVHZsdG1WSFJJUG5rOTRiWDdoN1g0TWtFL3hJcEtrNHBPQllHSXRydTVsRFNhRzQ5b1R6dXAweDhUTHRaSmYydmFLMnNTRHF1ejMzMEVCaUNiVnNFQjJ4MmJDeVFFTlA1N282Q01rN0lMY1NKbTJZZXdXR0hQeHFHVTJ4N21LNG0vdFR1N2QxNml4d0tqWXpNTUN4Y0h2L1haVEpNNFhWcEFHQXRzK1c2bDk2OTVRQU82Yi9lVXVVODNwVzNOZkROVXFoRDZWdG04bUgwSWpDMVJqQkhVMGt2akZ1NWN2NVV5VVp4U1J2ZENkRkR3RDQrVXFFaVZFbHVoWUxNcmRoVUxKcDYyRUxRdUVtZjNlRnd1dlk2VmVaUXRibTVabDJRZmhDNng2TU5kV0xma2t4aXUvY1E4SnpOOSs3RFdVNzREa3BBQU0zbFo5UVVkVWVYcTlubFRqM1BnL0FYNHdBOWFPZ1h5MjFmRm1XK2ptM3ZJMmZKU245a0dZWURMNE4xZXBPa0JGcitTMnBBekF3YVE0TE0zMCtGaG9JSFk5N05vWkEyeE41WUVkV3dvUUI0OE5IT2kwNVpaVmRrbFhiVmVPREU5ZzIzSlVnRnFBbXlyYzhVNzQ3cktnbk9BNzFuN3RmZGdrcFVPcndtcGEvMVU1Njh6RG9pM3krOXZEc2xsdUZaTGloT29qSWZCVFRuQzdQYnNreWZvendsNmQxUkl1VVA2Rzh3Ky90TGZUZVFibVIza0hXTy9CaENJSzVvOFBXSVJ0R2V3VVVKL0hrcEF5ZklPSXBHUGdvblhxQVVGSkRBaWY4alNHQmtId0lkQmpTTzVmcDhSQVR5VFAzdHl1RXZsRVFVandNNHJFNW9FSlEzLzB2MHZ3dERSekxidEZKMm5qK1ZwU2s3d0ZEb1FxMHhXYXpJSSt0RHhlZm9TRTEvRTVvL1d0T3VXaDFlSmxxbWg3UDBraWptVTNpRTJYclc5ZStyU1ZYMXh4YzZFTk40NFdMQWQwZlptSUdOOTg4bXE0UmdNSnNZaUpVMHlDd0kzaGJVbWFqVGQ1czZZRFhMeGhWLzg2NWJZdHcwN25QY0pScHJES1QxS0h3a2JqeTlGR3lZRFRtNTVJZG1vWDdIc0pNNm02MnFFcnZ1OU1PSXViQm9kWENaRGtYK3VaemhneU13NW5MRmNvSmNIZGJCVmVVRnhBL3BrOWwvbjVaR0g4eHF1TUduUXI4cm5TcDBCS3Q2ZWszT21rK2I4enFUQjY4b2VVeEw4elh1dWwwTTRyYnJtTGJKdDVMc0Y5U0l1WWdtaFFDdGc4TERtSkR1VmljSTVyenNMYnNvYnY0YWdWNU9ma1dzZ003dC9WWWpjdGZ4Zk9YOFU5WG9tNUtoRnhBb0ZXQVo1UDUvdEFhMlNuYWdzeGpXKzhHbzRWeFFrMWJqbit6Tko5NitZMVFBMWNXUTgzdndxc01XaEUvdngrN3RXb3V4aWlMVTc1bUFEUUJic3U5VHJaNXlhMGlvNS90cmxla0RiNnZIVDBHanZaVkxyYUxuOEhIQ21peEIxT0oram1sbEU4dmEvYUFrN28vQVVMSXFMK2k3cWFHOHJSUDV6d1c5YjZjTno5bmZQU3dSdnNVQkNPbU1zSEpENEExMUsrZWVJT2tvT0RrRGtXNTRLY3I0VkdPMEVlYXRoa0NZWFE2SWFYN2xoS1JIcWJvSjY2UGQ5VFRRdDYzdkEwVnZLbWpxS2RHMGZmVlVPNURwa3NlSDRKaXFZSjNMbE5SMkcraXlDZ0RlQ3dyL1FjY0ZpSW93Wm1XYkQvOHZSbTI2ZHhSc0VBaVM5L2xBdndNNW9rR0VLTDJ5MWxlMUFrS2tLUkVCTTZ4MVFIYU8zd1NyNnExSDM5dlZtcGZQMzhqS0Fmc0hvaVhHVmhidkZTRXJTcjljSVlTb2FvMy9aMTdUSzVsQ00welVUWE1RSno4SEhRelNzY1hoaXk1TkoyRUtJeG5PS3BYNjVSNkp1cVRxMXFvNzZsK3FoYzZQOHlCbHRKMll4aTJiOTZKa2lHSWFqZ2YxWW9oYlM5elNwRVRoSi9KeXBjR2xueVNjSkcrUzlJL3hXWncxOWhLU2paMkhXMTFnV1AxTG5wZXNkWWR1SE9keVAwNk5PTENtckFtaVNTT0JiNU40czhObG1DekVWZmYrUWxwL2U1QWZqeVBPWktkR2VtRVkrMjR3QzZFMW0rZkZBakZZL29WVkxmcEJzNzdSeDl2TTZjRnhXVWkrMkNidlE0YjRvUVluc1dhdnRwOEhvUjNuYjFEV0YwbW53dmRRdzQ3TXhwQ2NYbjJrMTBNSTdMd3JmMnZlTXNHU1BFbVdSRklncWozbHE5bEZmN1I5ZVVPaUswejJsd20yUFAxbStJNlI0UW5ZUDdENlJVZ3JpZS95ZE9uQWlZOHlsSnE0SEh4eW5LazdOck9aU2ZqMnFaTGxCdTZKZHo2NkNBVG5OSmtzVGhkTVNXN2RrUElvTnE5bGpGTHhpSVU3Y004U2FWMTUzcXhDQm95OS9hb0NMSlZPRkluMkJaeUgwYitJbjdESEU3bUlqU29NVnZBV01NNEwwRXpwVjArR0djUkJmallWNGVoNFJZaUNZU3lMaXdxckV0SjlkRnc2ckxmY0pOeDJubDJidld6QldtQ1RUUlVZVEtPZ1hsTHhSU1cxVEhRdnpZSHNkZEt5VERKN3JhdTlTb0RkN1lST3BiVVJtK2RMVXNXd1pYVGFRbTZWQ0VZcGNvZnFBdEpWSXVRNUdVc3l4U25jK1l2WG5TUzRibXBzd05TVndkN3EwUG1LWmxNUEUzcFArUTZNS01SdHduV0tQazFpVkN6djYwM0ZibjI1Ync4UWxkR2RyNEZNN0lrL3J2Z2hLQXBZS0JUb2I3RWZUUkh4S1hIQkl4UXBaR2E2emwyWHZMZ1ZPNXdsMmFGSDA0dlhvaytjNlErMlhvZDJiaG01ZGEyRTFER3FkcnIzWlJtaW1rQlZCR1NWQ3IyZUhFU01WaVVja0x1WVRaV0RYQisrUGhxTXdzTEJRaFFaNUhSUVMzTTdjZGxvS3ZNYjY0OEJWRGdZYS9VZ1RKenQ4Z2RoMkhZSVpONitKSldxK0xlQ05uVE8zRHFkeE1jQUNvMnp1c1JiblBzRFdqR2pLTEtyd2F2MzB6b0R0WFNGZEhWVkZWdGh6Y0VZVkhVNngxcXZ0dGlmbFU4VFlYTTAzSmRwV0k3WjF2REdmT3pESFZESkt2b0ZnRzBSd1V3NXUxdDFtaXZXdW4yMU42VFFvbS9kdGN5V05PTUVhUjErVURGNGF5UFd6cWwzcHR6RFhsVDdxZmwxTFJzY0pFc2lDV2hSM3M4R3hUdTlOUXRJSVkwR01ZSUM3bXl1QnhLSEhnZWd1SDNhUEcrWnZncEM5N1Q5S001bjg5WmZOK09POFJ3ekV5bWJSeEQwK0lFU3gxT3ByT1pBUUlUeGlONDJGV25HbkwwTnBQSWtGRnhlMm4wc281K1loNTBUMFlZSDA0ZkZma2cvQ3cwNmt2NnRaTEQxQ2U0QjVIVElwMzk1OXBIN2dFYi9PN01YMkt3SVhkYnZwbllpd1FDK0hzeUdySjdjTFhhU0wwbHJSSHNBZzUxTFVzT253R01PYmVnWmNVMWhnWW13T3NyTG43endRaGhmMUNJdHBrakRWeFNZNEdya21QelJtUFplWG5pRDFFWFJTZUM1NDNMdnVTTmQzeEZad21PNDI4WnlKTWJ4eTdjbkgxRC80SHlkV1czYkhPZ1ZSUWVFd01pcm5sTHIvYWxGUi9qejBvNUI2MkZiMHV1OEtCNHgrQ2dBcTZwbXRBQVR2NWdJc3phWHp0c0hpRy80Qk8zMldHeHgza20rRVA2N211TzBPYlhZV2g5MnpLZllKcFhqeUlld3R4N24wVk1SOWVpaS80QVJqbEt1WTJ4eDNIaHdPUE9SZzc0Vy9sQVNWdEFqQjNZQUZHMFRmd1RWbUJGWjQ4NDlMcDVETXBjY1RiMnFZeXNZSm5GaGJBUWZERzgybGVNS1lFVHk3d1JBdG1IZFNQNjc3NjNudmVpVFBQczd1dFRNVW94c1VFbXl4dFFjMkhkblBFbCtEQkk2YXV2MS9vR0FWdjl1ZitaZDRCSk1oTkpDeGZQQlg5NGJvMUNXMklWUnNoK0JCcnRTTFc4YjdIV2tiY0xvQkdycWhJSUx2U0hKSlhNRkJQa0psd0lYVkhGMCtuMitFVC8yQkErVXQ5WWZ4VThwOXlsU2lKVDI3bXFBVXJYQWpneDJaYUo5M3B2ai9TT3krUzRJbVdWV09jbUJicUFYSFlmUk5OMmxMdTNTVnU2NzZVUjlVbTk0aWRObnptNm4rajlReDRKbWRNMzVIOXVPU1c3MEJ6OHJLb0MwN1RYSTUrd0NhWTl4MlRZcU90eUY3b29UWG44RTdzRGRMTzlKZmNobVRyNHNUV25PWFNoSEo4L0ZFWE5LZkFob2Q3b1granUyc1FtejFMOGJzK1RmSUdkdnZVZ0c3MlpwZ29aZytiWmpMSkdnZkFKNHdscE1lQWtNUE04VEg5SHlGM3hUc3RlVTlOM1IyNkp0b1JDZlpNMTRSUndYd0JJWGh2KzN5RU5ZcS90UkpFTWNWaW1EVXh5QzRxTWFYTlpYcFpKVjZxNk1mcEUzNzZMZlRNVWc3YTl1Ky8zNDhpQ2NGbFB0YmplR05RRzVCNndIQ2JZaGlnZ29QbkFrRTNtZzAzRkNCbElWY3c2YVZCaitiMmdoR1Z0OGtCYUxPVUxyb2ZoZ3dPUkdkciswRUtJa3B3bmdOY0F4a29hNmE1N3VBa2d6ZlJWL2g5VUZSN2J5eEV1U29ZZUlWR2h2aXJIMUpnSGdsRzdlUU1nVG5JbTM2MTVNT1lzVEp3ZU1oaHJQeGd1R1RpR2x3RE1UNlVKQ3FKdUtaUjNmWFg4SmFiN1NpL0hueTBkWS9WUEt1SXlBbWlVZHpCNVF6QWRndjRtRDhQSk9EemdIemZValdBUEpURnViWkdLeExxV2lNaXBIMFY2SEFuRCtVMlg4c3pjTXBOZmxjMkw1NEllMFRzZnMyUjI4cjgzczZ6dEdOWVhTK2taRnczY2pkUzJMdSt0bkJIRldlUE9mbk03Q2Z1L3VsN25YaHMyWUhjNFFPTGZGdktvRFlVU3pwUHgwem5YdGVGVU9BYkZ4U1BxVitnVllJR1B1YnM3SmtMMXV5NGV6MGpOWjcxZ1c2NVl2Mkl4aXczME0vc0JxN0gzK3FCNkhpaVh5OE5jT2M3S21MWS9VM3VPZG11dlVGNWxmTURBalRId094Rml1V2cwWDlab1liL2ZXQjlaQjJrcWNlWGhpamI1YmJLWDhFVm1aQ0tmWmt5d1k5bC9pYW5rSzV4dG93Q1NuWFRkQUtjN1BKOHUxYW1kaVgrU0U5MjQvOGJRSllHQjU5ZWxKeUhsRWRxR3NRNDhVcDBITEVDVkdWZGpqM2VlWnBicVJuOHREdTJXY25WaS9CZ3N4L0IyZktNK0ZOSTYrYXJRUWFTdXJlc0x6WklTTVJhUGVvUDVKK1NScFNkNDJ0UGZUOWdRK215ODlFa0RMQnl2aWpKbitTR2Y2SXBYcHVsaHo4VUtWL0NjQlBGKzF1SDFjdnBra296LzB2SExkVmhyc2VjTTEweGlRZU4rdm9xeVFlMGhEdHcwYWZxWUUyRXpLQkN4ZTlOTG9tSndDVENCb1oxM3cwbURia1ViUmk2RzMzTWROanROQ3lUOHljYUlRNHRZWHpRTnZJMU9hTDdzTVdYMDdaQVU2cWJ2RUJOSVdNMVNWODNDOGZwS2VEVFUvWVBUZmR3YVFaQTdUUTFSQzAvN1pQWncxUjZ3L1FKeHpsREhmWEVGNlUySmVSY0hOU2sxSGZrQmFwNWhMYlB6YUI0NXVOZnl0eE1KSXNxTlBhWk5pRTM3Q3o1K3o1eTdyVWVlZC94WndwNWJGaE5pbktLY1NlSTYzWkVrc2FLa05CMEQzeElHUTFqYSt6SjdwZVJpSytCcnA5eDEyMDMwMy9rdGNJbVhMOHJ6bkdlSStkTFMwTnAwaWt1RWFMc2ZEUlgxVkkxcGRVY1ZMVEJFMG4velNMbGhrYXlhYnZGNm9VRmh3N2gzbncrb1dCeld4anEvVGVZVnRTRUxOelArQlZZcFlrWU92ZVQzaytJOWdadHJ4dzJ2UHo3YnpER1RIb1l5VkV2bXA4SkNndkZQOFJkT012ekVucVA0OEdIdjZ0b0c5MGVpaGl3K3BWVUZGa1BlYUtianl5YVdCNzdrTmFwbS91QWpNUFFJck5zL0diQ3pqYWdxUVFHcWFMQ1FrdHlUeUxJU0pyWHdrZ2xZQVVjbW9EQ1NaZkZhY0RIYi85V00xWFJaVlAvQmp5TzNPNk5zOWl1VExGZkpRc09Ec0toekd6L3lqZkFCeWFQY2VuSEczVXpTNEpBekNjeFNhTVIwb09tZzIzOHFKRzBaR0hsbFBwbzhOVGRTMDVPMFVHRkFwTkJCMG5mcVE0VWhueGR0RXhYTjJjMUxJUHhwdUxFaFZtcXBER095YU9PNE5KYXFyRnliY0MzbDJCMTlhek1EYWNUeFAvRzg5c1gyZG4vZVFuaEJ5b1RTaDd4Z1lOc1RrcHNvQ2NnWHlpZ3RIOHFNRi81MFlXdDVlZ0tNQ09DZnlBWmFRZkJGa2haTXJFaFJ0b1d0enlTSDFwZjI0bFFGckcvbHZ4NE5MZkFydExKSmxVOVI5QnNFRDBYMXFteFI3NXlhbGUyaG1QQkZ6WDVjd3ZuUW9nSkJqM2tTaGVSclNEaUZNV0Izc0pwcEg3WkZtVU0yeXhaZUlZeGxkSDhTSTVsVUx4a3VLbWNvMVRLWDBMM3k4OS9aQ3ZjWWtTNXVyQm5YQXFsTWoySkNXMy9mbTRham5kc0FvTjlScitLc0lKQ0RPcWJjczNUaE9jc0p4U2FQRmdwd1ZOcGZwVmZFQWVGZkt0TjVvUzdRT3pkMFNqVnhrdStvZUlDR0ZKeUlXTS9VRnNvbnpYWnE0aElBeVRhd2FpZ3lIWmhKZGt3VGdsVzRpL2E2amZtRVArcTZJMU53NHplQURLYk00MGtKbFBZUUdyTjdrUzFTQzVtQVFwUFRONnNKMGUzdDc2cDlUNHpiTW93SEVyOTU1b09FY0ZBZE05Y2ZHYWN3LzQ4MDkvNzNnZkJsNy91TXRkeFV4N0hvYjQ2ZHRZVGRDMHBwZGdBTXNiNVF2TnJHUUhtaW51VmppSGoxcUNUNDBwbmdNVzNxdjRTZnJxR0orWGhJNHZzWDA0L2FHVHlIMDhMalB2V0lzRk1SWVkyUFdzK3BBWnlWeFQ4eFdCWm1vbDNUcGl3cVd0YmRlRFgzS3FQaU1ITnVJM3Y4WlZyYXZYN0NtTytOM083THkwZXlYbEdVQjMwWStCL2pGQXFMdVVXL2FrOGZhbEtWM3g0M2tvcEFCK1ZZa0txcERzRkdqZCtibVZFbXFMR1JoZ0YyYUtPNjhOQyt3TURucmMyUlhHMzczb2hhV1ljcTVtM1VObVNkVGZlRUU0dHZydGowR0xtWmZ5UG1NMzRmV3VoUUN0bGZMcGNiRWdGZUJlRFJDQ1dDbm84cDZkWWNGQ1Avd05udkRHTjdLSkNuV3VhVjJyZHhzSjZNdGd4NDZOYlV5V01BYW5VWWNOTzlQTTd6UjlTSXJUVDJyemx5VHp4L3JKRWpyekk1ZWVLUEowRnV0eUF2djF6Um1IK2lkekk0aDhJR2FLeEluUUFjMmpZdE5QSXJ6ZG1HQlh0SUNPa08vNlZwQkFIZEVNMUh1VWpNaDlTb3VDZnJqTFhyR2VjQ3FaVERqT3NYWXZNaGErZUtPbi9oeUJ1Yy90NzlpcUpTUWlRdUQvaTNGQlhRUHl4STF1cTByUTdHVENESWp6aWJOK1N0VzhrRkJZRVJNcC9tWFN2NlRaa1Qzc0RsZUhuMGUxbmNQT0dLNG9Ua0JXTmgwMFNLY3U5Y2VQUm1MazMrNjhQK3pxSDFUTlVXeGQvSXdoWks3K3pnN2pXa2VZc3JhVi8zNVFldkg4cnFOcWRjTitrbHZtS1l1dUQwWjNHcFdwUmtGMkRINnNidEdPeXRoM0l1WDVLUUZIc3puVndhZWlMeUo0VllCWW5wZUNzYVFVRzNMa05WZG5GQ3pEb09DWmZoMVd2eDIwdFE2cHFZOGx6SWdsbDdjMlJLR2NlRVlZdXJwOEY3ZW5mYmd4c0VURHlmaEZJbUI2NmxQYVJzbmVRMGdocGhwWlplMVNrc29ZRTA4eVF4VTdnWU9BZmYvcnYzdlZWZkkrY3FnL3IvZUV4dDlPNmRPaGFJTUQ1ZjA1emxnRUMxUzlKUE83OCtKNldPR0k4WkQzdFZVaHE2OFZBZmJoMkIrYVdsUXFDNzF0aXA2QUVRUTh6R0hyNkFHelhGcEFSMm5tSk9tMWZVL2lpM3Z6aWF3MlJGRlhqRnVKc0dMb285bTh6WlNzam40bXFybXhrN29jVUt0a25jWTNEZG02Vkh0T2o3VmpxZXRRUHIyc0lqK2xPVjlNUnU4S09ZTFVLdjJxdUVJRT0iLCJtYWMiOiI5MjJhZDBkZTA1ODQ4ZTA1YmE4YWQ0YWRkNmE3ZGQzMzdlZGQxYjEzMzQ2N2I1NDJiNTAxZTVhNGZiNTdlODQzIiwidGFnIjoiIn0= \ No newline at end of file +eyJpdiI6Imh6NlFpdHNpU0FON3hVb2pRaVlNbnc9PSIsInZhbHVlIjoiQlkybVMzRnZESUxkQUNXejdsbjlsRW9GajVmZzRVWnlQRGlNemg0RXRUOWRvNHk1RXY3aDZZMzVXNjVURUJJQmZ0R1dXaVhYQ0VZbFlTTGRwM2w3S3ZCeW9zNStrbDRWdzhtSDh1ZWU3Nys0R2thQVZCRjB4ZVoyVnB0V1dyYmVTWm9RMFRkOEVyUVY2WnBCVVRKbVpXak5LNXIyVG1QZysyRGIyV0ZkU2szWlh5KzA0WmR1dTQ5WEl1a2ZVYUJUV2dOSGdGbTk1dGlvV2VVRDVCQW0zQ1hqcGRmNzJvRFl4dERlL2puc2ZlSGh2clJybkNiYXN4UUFOajZrSXIvYjdBajBmL2NJQVlTVE9lbU5ZaEl2VGI1NHZkTlBrRGswZGoxOFY3bytrM2dOamkzNnhJNVVYWHBJTkdsd2xuVTlxNGdzRUsreHpjNXJUWG9EZlNzZXo4V2drZlZ0VGJab2RPUnlNOVVZSVNPMG16Zk5pMGxjZEtrQThUa3pXd1hNY1pBN005aXQycjFOREFlS1hTVzlHaDhiTUo2ZzNhdzZQV2ZGVjlDUmp4ME9VY2ZMZWVoVjg2RDVZb0JzU3pnNTcwQytHUXNNQk5HT0JJMDNObGw1Mlp0cHlmakhhK3N5YTJ4dmZpRHp3aXBYL2d3QlNMZHJBdGVmOUpDcGVYa0ZIVzJnVFJ1TDZlQVZzTFJFeEVaYmM4OGtVNjdSaEdmUU1JSUZiYTZvNXpLYU03Q2dkTUtTZFV2d3NRRE1xZ0I2bzhVeitJVlFWcFhubHoyTnpxdTVKeVRjUXlmOVhEQ2xiQ29oVDVOaWtJcHIxWk9IODJjZGVqcHgwSER4WURzclZKSC9CM2Q3STYrSFVRR1lMcEowNkhWUk1vQy8xRG1kZGt3a3A4ZThRM25HVC80TTZZYW9aeTJWZkVnUnhOZ0daWHgzeEd6cXpFdmpQTE45M0lKUmNuSTdXU2RDUnVpcXpsaGxhQkRKa2F1QlhORDJ0eSs4aFZTV25SNWVob1dGamc3Yy9Id0dGdUJVcElQRFVxSUJvdnpvdFFibEdpMXJ3cFJ1UW5CRzRJV2w4UjVQVWI0ajQ4WVJqaVVqckE2Tjc2QVFwZURjeVBJaHZ1K202OXh0eHgyanZwM0RVVSs5Ym5IcTdXU0NkT2UvNHNKZU4zRVVPendWN1crdWpTbHJIZWxHZW5NZVlQNDRMbEk5Nnc0QkdXNWZKSG1wa2hPbXpJNTBZbTBNZXdtOVZVNzYvZnJmdTlQR1hlQnIrNnVvTXdWbFNkZG1mQitza0sybThkcmFWOExtb2JuZnNDb2Y0bnluU29PTVBlR3MyUk5DZ01Qc3dTRVoxVWJidFJhMDFUUDIzRGhvUkZQNHpRNGFKYTdCZjAwSHl6a3RhT0srOUZmQnFrS1VlTnRuNXZjWjdFbE1lREhieU9OOTR6SkV4L3RVUEpnZFVMVGJPck5ON3cvNHlLQ0lVS252MU5kOXd6Ym1SVTZHQXFxN2lLYXpZaGg4dCt0TkV1S0J0blRkZDVVS01kMkNmMWIyZnlUUmIvSmpUaFh6TGVFTHM3T2FRNlNRWkhtUURDaEQ1RHJTL0RHSW5pVStUNEQ4c1piVXduMG9JYktGS0M4THZkWHZhNHNXNEVUcDlLbTcyaEVTcFhMM0pMczE5Wkw2VDRhdU5KZlErV1AyRFRJbFB6UHlzZ0NmVzJGaWliYU1seC8rNkFHRElFNmhiODlsZmZyV01JSnhrdFFac0dFa0Fsd3JHeG9tQmY3cHpuUEd3MkJvSm9Xa2xSRjN2dUdvK0NHNkh2UURoRWJuSmhkRU93cjRMYklxSHBqbmNYR2packdaY2xLa29pTkpWRGRDWXY0WWlmRVZsR0d5bFpjSW5iaHAwNi9uSjFoRFdXTFliNXpaWVBjMUpnSkJQZ2JLMkVSMzlEZi9RQzZESklDOGJ5dGhVczg1V0phOGVwVU96aEppL3hhRlIrMGlnNFZHdVVhOXdXYTQ4UEphTzJTSVFVWUtNYzJ0SVVWVjFwVnVkbytuV3JCQzBmMWFHVTQ1TUJaNm8vU3JnZVRhbEVOZFQ0MWRnOEU1UDBja2F2RVRvZzU4VkxsUm1aNDcrVGMwUmV0MlEvVVI5bGVvQnN3eDNwR0RibTJ4Q3BSQ1cyT0M5elJKMXZnZTY4VnhPMURkUlEvNkl3V043MDUvVy9vWE1oQjY5bnVtMjdBZE1hVENzTWJpYXgzYUQvZzl5cy9ZRk5Ea1VaUXpjT2JMUTRGRG9HU29CNHNwWlJjNmZLMjBQSWVnWXhreFRVdnlaY1BTUVNaeUJwSlNUUnpLZFBVekxoS05WVmZCTUpnMkVLblVuaTNNWE5lZ0x6Q3FwVG9kb0tXTHRQdDRqb1JpUjFibHU0cnFmTG5iU2JmaTY1bVBOb0JSdkxGUEZMNmZpc2tWOFBSem9zU00xQ1ovYmJGaXdwYUdTSG5FSnZPWXpzQzQ4NXVSU3Y2YjdYY08vZkgxdnJyaGNzcGU4Sks5SDhnY2lKSURJdDFEazRhRU9YdVN0Skhwb0JvVmkvY29MRFQ1UmtyRCtmUkw4ZE85WmhUMW5yb3BmTzEwZXN1azViSEU1ZDF6cDRYL2VPQWFjb2diTjBZWHhTYUgyMzJ2YW9iOXp5WG9aTUxOK3RuNzRhZC9WTm10VStLeWRieHdkTUdYb1NZM0VhbWRZRTF2TmFlYnp3bUc5RVBOK0tMZlp6WXJkT2RhYlVTcXB4Q1FqRFU5Qmkzd3lrNnRqSzh0YTJmRXFEdzRCK2dSeDl5RXI2RmJRQ0hOaWRTbExoUVA4ZGNmRmwrNFF6M2p4cHp6MWxabTJlSjJMTFNETVBZbnB0cFJsemp4YmxJNzl6K2pPNDQ4YngwSkJXb2c3L01ENzhwN2FYU3FsQXlrWktvZ3RaUHhXbEpWM29LYmkwMFZ1MW1oT0hRRmxzdURTOENEbGU2aytzQS9nWG1mUFdOMkhqWkE0UFFWZ2l2V1RjZUhBblhFM3RDVytEcmphWG9DblNya296S09qZWlmM3hLd2FFRThvdENTeDl2VWpHRWV4TjFqZDNwN3RGQWozQzcxbWN6emd4RUlqMjhvSFJxekp2T1lMUG5qenVwelFUcmdiaDRRemV6VGpUTXMxVHhkUm10TG5DUlVmU2dnVnJPRUpCSTRmK0FGVGowZUdDUkJlWURhek5ISGtZdzRUMThtSFNlK1RnNzRBaU5qUVU2RjdFT05zMnF5VzhYMTZFbDR1WURJQWVQN2pGY2E1bXJxbUo2bjF3ejVOdFBkT2J2a2N3cUhETEtyTSttSloxQVVSTTRad2NRTERQQkdUeloycjVReWh6ZTV2ditVdjlaYlM1KzY2dFNpbStRQjVDR0RiRWIrTCtXTEcrRUlxTk1Xa3dxT2h2aVJmMS94WnBMQisvZ0pnTWljU2hhTXJ5Sk5MVU5DdXJWYnUwVUlkSzJ2UDZFdVIybW9ZeGpzc1dkWkRSNHFyenlqZWtmejlSRlloRnROVUhEYmpteklpQy90aWIrUzFUWGpmT1M2ZW9sVjBkVTR3VUtzK21lWTBXcUNXY2sva1BCc2NRUUlmT1QvTHhaSHE4WVg4M25SdE5EY2prak1UL2s1d1ZMVjFuR2V0VDV0b2JkcTliQWhLR3AzU3JmWWVWMTBYam8wZ0Eva1l2bDAwY3pVK2MyaWxKK0kwWHRZYjVlaDE0ZkQ5bm1NeFVkYnc2RDR1UDJlSHVKYWVnOE8vU3JjbjBkb1dBYWEwNHhXTlF5K2JLdmtNVVRjV3lOM2lpWStTUmNEZSs5TnNZczVCV0Q1VW1POTFsazlWWWlWK0R6OGMxamdUdmdhUUw0NFVEVjhmakliM2x5WUpFeWlkNnhkQnBMeEY0Wk9QN2hTVmFheXlTVDE4SkovSUluSXhMUkNhTHhLZTRDNkJkNjk0SGFZN0dEWnpPa0FReDBXVlN4bFcxQThacUt0dWJlSEQ2Mjd5emg1NjM0SWpaQWdJMWRxVGQ1azZ3aSs3QUxnREk3TStOczNPd3pwTjhYSjZJY3hvWnFHd3JuMGZIa2wwa2c0ZjBCMTVQU3NlM09IcVBGYjdxRjBTU0lTWC8zYXBJaWM0R2RBUlJuak9RaGNuTURuWlNGRnJqV2NEQW93SmRNa0s1S3o4VHc5amF0bFpjcG93Z3RNZVdlQVNmUlRKcGR5RDRxU09wWHBES2d0ZDFiSldwU2tpRC9adzlwZC9aQkltQUU0eGFzYTAyOFJ2ek5rVVZmK2lCQkhOb1U4SEE2aVFOL1ZCam1ZbzdOTGtkVUhtdU1DSCtuSzIzRllTNnlQZStxTXkwMWxHOGtDQUpCaUxKcE1mckxOMi94OE5tQ3FEem50d3FJaVRVMDdSWHBrcGs3L3FZSWx2UHFXVnJDbHRYMHdMcTRQMlR5SHZRWkFRcnZTczRLcXhsajcrd3BnMzV0RGljdHdVWmJyYTRxWTluZzVzcXBBNnZqQ1BFNXFoYmNiRmtBZUgrTktzNTBqVHVHdExpZEFUUFJxVy9TZXNiZXJQSmkyNDMrYzJaMG1YQUs3S1lvRGVRaStFbkxpNStEamtFcGJuSjE1b2V0UnVBaERZZ3AyQ2Zka3kzMnZKVTFFNHpuaEVXU0tjblVnMUtGQnkzcTBZQ0FVT1EycEVVMmdndFZlNHJzT1pUVjZaajlIMnR5ZDQzN0FTSHpSdkw0aXZ1Qk9GUnB1eDhmZlNoNjM3SlpBQXBEZFBZY2lYUFg4Q01ZU3E0ZzBhSkdIQ28zM1U2V2ttOHVBQW8zVWdyOGJCa0lEaklQZFMrRnBleklJTXdqL1g3T1BPS3QrcDZGT25NRHQrMjNMeWNWbHF4M3M5OER5WFFZbjBpSjFwT0wvRnBOa1Y5QjVoQVIvMXJ4TWJvUEdZYXNudXIwalBoRFBxVmhMVit2Wjl1VzJKT0FHd0NaR3dWMmxQK2hubE1tQnV2SVJQZXFuRzFYSGxYSG9jVDVzS1lHWXZFOTZnNGxsNkdQNzV5R2ZTeXVqQlY0Q2JxSUNBcVRPemVHQWdiaituVWc0Wkp1RjdWNWxETkpVSTRPdmh5d2ovZ29NbkRRWHo4b0Yxb091VG9QWnkrTy9QRUxUVmZSTFQ0aGxoYVphRittQ1kzSVVpbXBLYitKRldLUU03R1ZmMGFsZEhlWkNkNk8zc2JhLzlqM2gyb2wvbmJUZ0RnU2pIZFRzN1c5TEF0ZUVyaVVyUDE0dGQ0ajZhak5hcmhldXZVVWtDNHRCeGlvNUlHN3NYbnRMVGk3NjVudzVnOWtHYVpuK0JYUDZnOHdsT3pHVVZ6a2M1TTJUNXk0Rm1yUHdyQVY5c3Z3RVhJeFpYSHhBMzU2NnowZ0VEdUFXc1J5MzZxeFcvNFU4RlMrMGtWY0NpeWpkamRkRzZ1M2pYd0twVFZNdkNMeWN0T2tJa3pmcCtSZko1akdzaEtQWnNBem5ySHVrU0t2cjdteityeHB0NG5ubGpJc1BPTjdWNkFYV1VaalVrSEJzcWFVQTdnY2hHNU1LS2k5NEZxNUJLVGxCTWhia1VLUVdTTU5mcXIvaXRkdVF0NEFDQWVFcm9rSVVKYUJ4akxibThiTEF6UGZFVU10b1I0N1dxZ255Q1FTL1pUUTJTWitaWm1QRW80RFJFQ0k3Zm5zaUVCOFFvdGF3aEY5dlZzUkVHTTU3bnNOUEVVSDVPSThVT3ZNeUx2OU1GVi9KTE1VbjFhM2kxRUdSblg2WFdmbUl4ZVkyWjcxeWttM21FRSs4VHB3MVAxeEhlMi9MUW90NHQrZ0ltOFM2cjExN0Y2NHh1VllzaHFpVGJDVXh1S3BBRXVwU0NEM3ljNE1OaTVvejNhV0lzZVdRc240cFBGZHhRZVBWaFFsNTljMkpqWU1QeTVXdTFvcWg0UVhPZi83RnlBdVI1V2VVeGMyUTNxOEhKY051dGhySnhtZ0ljbGFQN2F4dldmSGNxQ2dOTDJPSFBXUWY1eG8vT05aU3V4MFlRc0l1NmxmWlRQS0tndmpXZVJJNnViQWpLYjB1a1doYmFETUpidGRIS0RXa2VOZE5TTzVQZ3VWZndkOFNPL01vUVhrUHRJdzlZV2lnYkJ5MnRCdjRLVGJKSVVuL3BOdGNUVHRGa1lBaXFvR2VSTGoyZ2FIT3J1NWUvSmFlaitGNlc0RTJkeFExdjhRM2FNU0FaNlozZW1CR3lKbUcwNmwxQXA5N292NjVJS0JiUzdPOFpRcUpwYnk3Z2JuMkREbTBScEl6cjBOclNSaEFzQ3haaFVyT0hpWjhYZm9EemNjZTc5RDIyeXRoK1JrNmZIemRUcGVPU29MYmRSOFZKa3BoeHpFUldmaWtKRWkrTDJ0VnErZjJjTXVSYU4yQ0xZd0NPTEJ5bUdZYzZvZ1BUSmtvZFVMTm9VeVM2UWdpaFFhZGVVZWxyNnRBaGwwSC9XSE8zVnlFblpHRW8yeVNvNkU4VkowcHhmY0ZTQ0c0U3cvSEwvdTM5TGJrc0RTRXZzS1hpMmlIelhmZmpHOW16K1dzUHc4cE1ka1cvVWRJTm9nOGxQalJxMHNWRHppend4aHE3RzZGR0hBdUtZLzM1WjJMeGpjaGZPY3c4T1FBR0lsU2dFRjJpczdjajAwblcvdi9BNUxoWXcyd0hPcGdoUjJZOW5ZdXdYaThmTUIyNXRsYVgzQmRWUEZBNFFWZlp6YjZBYmRBeVZZQWN4Y00yRkxITzBlRFdmdDJOZWplVXdRZS9hVGtDcGw3eEVhbW5vUlZNWDhzbU05ZXFNRlh6TU9YbVNSeDJLYmVlekFuY0xvZ1hiaWg4YTlHL1YzV3hVZEx0Y25Bc2lDK0NJVytzdlc5WTZTekFpMUxtWTAyN0h1S1k2T1VOVkpiNkpmWnV1SGVJSHpocU0vTnBVRWxiR3pDMUl1enZMVUVLQ2RWaFQ5Tjl0T2t1ajdQczBvdmQyNW16WXcrSUxkUmtMU3A3YU1zenpkNXpHRllhOFZwVUV0WVIyNEdza0J1SzA0aFlxOHBpbmNrcTFuV2dsZitSV0FlRG1PamhCWUpmYm53UXMxSUgyMEhjZTdNU0t0Z3JaTGQ1TmVtS0trV3ZXSzJsbHkwVHUyVTZkNmZmSFlDcC9ZUGlVT05JVGU0d2MrdnpMVkwwbStyRUZxa2RocEVkSno5cTFpYlFnVmxzZHJyb0tncUhRNENuNWF2Q0hCVmsrV0lzVVlIckhIck9teGpLZDdRQkxycWxpUGo1d29GRW1TdjZMMkpVVXZxMyt6RHRjYTI3c3NmMmVqWHpCNkQxOUY0QVFXMkFRcEYzM0t1UEcwMDhiOGxRNkZiUEN2c25VTDF2eGprSmxLbmRiYVZTTGNWaUtVV3pNKzZsdTFudTk3WmY0UXlkTVpCdDhmWURrNzVkOVRNcHFaZ1JwYXRNZzRuYWZxZ0FSV3ViSy9XLy9yb3RhcnRybko4R1pkNlBZNVp3a0ZFN1ZHU0YzYm4zemhZRVprUEd2cllLamRXSll3ekxSUUh6WGIyUVE1dlZnc2JBYzdkcklVVUlla25OaEVtcHBwbHlES1NKTm9wS0xWN1c1ZlVKN0FCeDViQkpqTnBOYlA4SEpUWHF0UEw1VmZmY21HNGhXblpUelAyTzYwcWVMVmdWR29Eam5wMmt4K3pqTzFRbEdTc0RBbzRrdE8xSlRCMlg5Q3BWNmtEZDRzNXEvekFQQTB1RXpPeHo5MmNPMlUvOW5WM0FPZHJFRm9BS083YVdYU21kd1VaWFJJZUowR1dPZWo4eUtYcDZyV2FuaXNmaHZPcHZZdTBHOHFhWTRJUWdSelRBVE9QMjU0TVJST05vbVhKWWxub2xEcE1QVUhoTVFxU1YxQ25CYkhrTzZUTkRWbEVUcXFsQ3FDVEQrNkEwVjBycmVQRlVFRTJGMGpFYUJUNWNaY3RoNnI2cjlQU3ZOUjNEcnhHSklvZTdUSm50V2w0b0Y0VTJRdkxxZXpBQnZneittMDFVYTNScnV0NVJoaDloYW92SmZKU3dGamRmQWJORHV0V1FDNUhLazdycVYrRnowRUgzWEVzUW5ZQW1IK1FCV2xNT3RkZmVpS1FVSUdYdlFmS1MrNm9XYVV3cVQwTkZ1RUppWkhSM0p6amY3cC9uTGdZRlVhZVYwUnAzazlsR0FBVUhQWERlSEZ5VjZLTDA4YWxudk1weC9TRDVUdFJ3a1FSRm5EdDdHQjJFUnArYXBYbjlWQ0RLNTcxRDRWYUZPcm9zd0Fub1k3bURqcm9Lb0o3eEx5bVZtVmVvZEpXeGE3VUpHejF6RHJoY3A5QjlIaGhQUldSNW5UdU5vVnJBQlFvdEJFcWFhZ05NanloZXEzcndYRkFWVVE5WEFoRVNyV0M2andiUld0ajFtay91U01QWG5xeXVrUEFHMUJaZDRKZENmUW1CRE1qQzR2bmF3b1FHS2VCL3dUdlBHMVplTzN5a0ZEWnVWSWFORTNtNGY3eDN4YWkvMmpqMG5DeUsyNXZxUzk0YzdCVlorVndWU3BTWVYzYS81L215SFcxU2h1WkVnSG9zVXdkem1oc1RuNlRQSFZLS2M1QStoUFZiY1V4TVdBdnFTMm54V01Da1VIejBpUjUyQlFVVmRjMUE3b2FvRUtKZjJxeTUrbk9oMFIwbDJ4amg0ZVZERzRCbzRsK09iSEYxTnh0VDRsaVVJMjh6SW5zNk4xOUdLYVcyZEs1L3NsZ0RHS2ZaZ1ZBQkwrK25NVVAxWURQWTdZalZaUU5CdmI4ZU9ycGhHaGRhWXAvTDFIYmFxMnpHQlNRenpvK3ZmWENLMjRpd3pCWmw0VlNGUU5LT2h3QlNzZjR1RVFHS3NwdGpKWXp4WHJ5TVB1NU9tbUNEVU1wdnU2TEc4d1FpM25vQUczZjkzb0l0cVZhU2UxcTcwbldsS0VSWkt1WGtnbXh5cUl1QXpVcG1XdHNJdUh0cnN6S3NPeFN2MXhtamVxSkNEZXJveEVnbGpqVXMrelpreEtlVWZWODJQcGtpU05veFRJV1czb2FMOGpYOGttdWsrU3Q2V010bUxzdWJaN29UM0M0VCtOZlNIT3VNUVJsYis1WXpUcEhYWEhXMG9RS0ZXU1UydkNjZW5CNkEwV1BSemZHdzNMS2QxZjdEQ1ErUGJESlJUR1V6bi9DaFJFQUw4YnowdW5SN2ZvVElibTNGbXg5MkNvY3lsaGpPMUNadjMxV0wycW90SVlhY2RnZTZiNFBCZUZlSklMaVV1SEF6VHdBcFplWDFEZTdjRUo1RFhxMnhMS3dYdE1aTGZveEZGc2ROcTFadk1uSmZHSUxBaHFOd0p2ZVVnbVVTRjJ3WXY1STJ4R0FmZnhzelFRakJOSXJrNnRJVUUvZ3kyNGExdEFJRG9HeGRibTFuWGhzSjlMWENxRkZndkFaVFBxQjllR0tQTm5jQ3FoQ3Z0VkJqcDZ3NVZUQU5RMVZGSkdUVEJzeXpXcWlPazVtVTNwWmNFVmhuU3A0OERYSTFwR2NNbkJoeWxjVnQ5U3NlNFNXU3ZyUDFuaTdzbXZlZDViMnJBR1loejNmVUZlbkg1cFU0SFVRcDI5WXR5VjIwQUJzRlgxbnZZb3JKK0hRWlhTMll3WFRFdVJLRXRtaE5DV2djdDlzM3RRNkRiTCtac3N0WE95K1hydDg3bzJxaWFQNFl2ZkcxV0o4U0dNMDc3cXh0aTFSK3dxTTd4bEYxMW54TW5BcDJIcUZtNVMzRTc1ZUZzbE9zS3dxZnY5WkRNVHA1VlIxRUJlOHlRSGlSQ2xqdHFTMG9rVUxrQnFsM3NhaVF4UDRsV2FQdFA5TUVRbHRPYllmZW1iMlZQUk1SYmlSbFY2d2NQNjM0RDd3TFFMbnZESnNIYmN3SmdJZE9XbmxIR2lLdkFrbFphRWhlR3VXckVNT25sQ2dSZy93K2d6eG5XRHYwZlVkQ0piSUFnSGZXU2dmWVZrMjh6S25GQ3hVTjFaOXlnVmxaUmhEU2lnOWd0eXRiOXlMbTBhWmxLK2RYandlR1QxUXVqMFFwakg4WnQzdmR5V3l6MWtDRyt1ZGVnVUpwSXJiK01iOGZjT0hiMm4yNUVyeWNsRWNHRnp5ZnFVRG9qQnovVkhUamUvNFA0YXRYcytYL2thbmhOWTl5S0lFb2ZUdXRHWXZEQlJFZUpDVElsU3QwdTc1OWN5MGdWcExIVk1WdHpacklvVmVRYkZZbDNFNU0zR0FYSUozNEFIZGlZL244VkRkZnVGNlhRc0VpMWNPUEt0SDVsV3U3ZithV01kSkpsZmJNUXhEU0pubVZ0QXRnK0tKcXVFaitUVUFzSzdmSVAwNjNmWVhERG9vcG9hRmFneUQ0T0w0ZVJTdDhYZ3hhdTBpYkM0cFptTHhUWm5NN3VFODFoenlJb3owOVE1NHlpelB3cFdDU0swMm1CZncrT3NsMERsV2J6NEZHdXdxYUM4QnIzREEreG5wY3NqanNDRkJucCtEWWZENnRXWTcwUXpZRDlSOXJzSjBFNHhLQmV4dUE2Y0I0VE1JaVF0eXlxYWdaRW43MEswZ05iOG5OZ1BSVFJJaVd2U05MUW50RTBvYk5pS1AwVHd3ak1aTGxNYTY3VXJidDZ1bHAwcGQxQmlUSGo2QmFBbGoycFBsaWhVamtCd2g1UE0wV2lUck5LZEVqbDRLN3c1OXY4ZXJuRkhVWWFSYlkvYnE1Ym9LamlHeVhnMWZncGtqc1ZCNVJ0enk4azRVdkRlVUxhaVFhT09xcVc0Q28rN2ppbW1Ic1pubXRGL3BaSENPWkEraUtGUEljTG9vSHREaEtITTBxeHdTUVNxa1NibnNyc2pEQmFqc25LMi81L3poa0kxTWx2SjJtWk1zYjZ0Q3R2VUsxdFoyQUo5RzNxYlZOODFDT3JPVzNSMVZZM3pvY2p6TGphRXc4N3lMNjlXeGpvbnI4SUFMd3VNNklBeCs2clBEaTA0Y2wxbE5UZjhaVUxtWTBadWhWelFHVWd3T0JPQTFEbXVBWGtnNnFKUXd5LzdtNmpTK21KVnoydzRJNk56RE5XTk40K25Bb2swRmJVQUJmZWc3eEUydnNUaHdIMm1RNVREMWV5d25ZNXAvZk5DdFhSUFNvMUxBM1JEMnNFZXllY0NuYVJ3UGhIRUU5a3p0RWhzdGZmNkRZRzRqaVhHdDc4ajF5emx2TmR6Tjl1VlhMcFhnbVh2bk5pOEsrZEQwNmV5R0kvaTBHNjRZZmRocExIQVJabkFaVGI0eFNHcFhPV1ZQQnoxR1Zzenc3OTZ2eEl4dXRuVEZBTnord0ZLK3ZoYUNjTHNHOFFzWFFJS1ppaWhlZXdFdEIwNXdBMlQ5cFNUdXM1QWU3aitBZENOUFRrSy9UaFhzSVhTTy9ZK2lmeUFDenBVWEVuZGx6U1VDVEtmLzNQNlR0RnZ3RmF0aEwxOGd1bzgwNWpTUFUwVmpKMTB0L1VrTGN0WFY2clVjYnAyTU04OFpKN3dUTi9HZ0U4WDNNSUVQOHJlU2RJMFdQa0U2TGxscko4aEpQaHI3ZDJDK2lXNlNYY2R2L1JhR2NWL01JZ2o1ZTdhdXZyTVdIYVIrQjhFUmtUT2FSUjIybG5YVmlISmtEOHZpS0QwS2lENStzMGVEQTNKWlZnS0l3R1Q1RXFlT2t2ZkFvME5YWTR4T3M2RUJNN3BGS1FQSTI5WTZxd3lDTCt4SENoUlJZYS83RU56M0lVM01uL205UTd5QkdXUzBKWXVtNzZscm85SmdvbGlVMm9yb1pFUElkTVpKTzJtdk4xeE9KSkxTZUVhbWllaUZiRUJMSWNhS0Z6TzhTNXZaRXloWXVWbjEzTnVLVGdlWnp1eHVHSzNZNzd3YkdIUFBhZUtMcEpwaHpIczBnNk94Wng2V3IrQU9VemRqR21HNzRQUzN6U2lWRDRQbGFoSThmTGhRbzFyRGpidmVCenFYQkpocDBPaEhraXdZLzhWUll1TnFZSFhyaXhkYnhEL1lKZkJ5Z293UTdNYzdUdi9sV3pQUlZNT2Y2THBzeEVxRU82VENpL2plNzE0S29EMzFKeUxkWFMyOEJmTkJOOVk0b2Y5OHpEYmFXVkNDeFFJWHc5VmQxMnhmT2xxZEpRTkEramFOb205VnFsTGpJMS9VYjAvT3FiTXFaNXJ3OU11NFdNUXNTV0Q5WnY4UnM1RGo2Zk9zandaYnVLcWxKK3RxWE5LS1hKL0FML0oraVNnSVhQRzBWT0lvUEFPNW9ZVFhDSnMzRElYZWQ2a0xDMnhyNkhTL3BWS0VaZEhuSVExdVh0Q2tncU9MbVpzTHFQUVpZU093cUhkb3hBUG9aMHZBYWJxRzVkT09wVDBJekRXdW1uWGFLZ3FqTVE3WEQrNXdEN2NWcWV4RTJFcTR2OTVNeFl0N1RXczFTLzc0VkdFMVl3R2R2dXRiV09vR3djUE8ydmtoV1NUQlNRbUJjN2JCNGZJUzdTYkFDcnlZVDkxZDl6T3lZZDdTUEtBUGdiZFdVK1dtanlwOXBTZUY4dlNCU3gxSU9oeE5XWGhHK3ozYjRMNHA2L0ljcmpZL0RhTTJqNGlZTnJjeDRHTXRNSWNCMGVFTUpzNEpPZ1FDZXkwREdEVFBuSVZZZXdXL3NuSTloYTRLaDJQd0ZnbDVKSFhKcVZUWkpVUm5FTzVzSDlsazBNUnI2RHp0cUlKd2FXVzFuZGdva3NZa1B3SmpxQmk1TEg3RGx4RzZMTndMUHpicmJ0eHBkUGtKRWlxUkhmVUlWMENqUDB2U2svK2pCTFZEcXIwVlZHWU92NlpZL2h4SHArcFJ1bTVOai9BMUFYUzBoWmdqUVlyaTRCVndmemUyTjgzTVVUbklVdDdsOUE5TVgvRXdRb2RMa1ZBSEY1UWlsR0x0ODVRc1dENEZQZGpza0JxeXo3SE1SRDZLaEJpTFRlSkZPQjBNQWpnSGczZDdJZWpuSDk0Sko0UEp5Q25uOEs5Zkh5MTc2L2dYWC9OcVkyaXhEdjlNRzV2SzQ4UWduZVpWSmJET0NTeFFHbGpSTjA1cGordTNPT0VNdkhTbXh0YyttZUNJZGNqSHcwRFNnN21uaGgrci82UDlRUzA2MUlxMWdjWGlaeFhtQjJXbGxZRlRpbHErZlFCc2ovaWxMOGhZRlB4ZkRYUkp3N2FYaDJ5ZVhsd0lYS3VTQldzQnRtbmRZU1FKOHIwWTBmbFBIeGErYk9yOTF2TVg1QmU0NitSWkNrOE1OU3YwUDV5WEoydm1nUTdSYjhrd1AzZGhuZkYvY1lHQThrL3VSSjZEcHA5aGM1YjlCS2VUOHVuZlozUVJpa2F6L29OK3YzMUVrbWJCOGVQMXRMUE5SOC9jZFB0SlljeG4vdEU4YXBZZmRTcE1YRkROeTFFR3NsUjI1c1JNdlpCNjlGYjlsclVFLzdETXBJd3l2azlPU3IvOXJhKzZ6SzNHNE9nbnRwcml3TnptMys5M3pXRWl4RCtRUlZjU1QzMHdSNlJDQXY1S1hWTWo3RXFIRkVRNjNXbGV0UT09IiwibWFjIjoiYmRkZGY0OGI4MGE4OTQwNGYyOTM1M2ViZGNlMTFiNTIwNTg0Njc5NjRlMGI0NGI2NmVjZWIwNDUyZWIzMWZiNiIsInRhZyI6IiJ9 \ No newline at end of file diff --git a/resources/views/email/template/client_premium.blade.php.enc b/resources/views/email/template/client_premium.blade.php.enc index 2d19b86dbc2e..1602f7253c66 100644 --- a/resources/views/email/template/client_premium.blade.php.enc +++ b/resources/views/email/template/client_premium.blade.php.enc @@ -1 +1 @@ -eyJpdiI6IlBsbENyOGN2em81MEVWa05EbUFJS1E9PSIsInZhbHVlIjoiVEFHaVExVUQrSjlYSjlCZVp6eHVONCsyWVdvZkdoM3g2RXhZREV6WENodjVaYjZDeW9lbjQyc3RvejlCNDdERXljbkFVL3NHTlZTM3VoZE1tWERreW5xdXZYQ2tkcHpHT0gwRjVEaWE3TmErUDJvMHp3amdQZ3o5ZmQ3RzhURjcyWnJHMzR1bElCMktKUzN0elphNnZTY2ZkRHhBL2VVaWppMnk1UkR3MVBPYWttSXZmYUdHdWlhbkdnZGdGQ01LbHFWeklwYklITVZOUDVIWE56dkpmSnR4U2ZDQVlZYTRiZ1FoYmlZK1NZMHZLeDJtcjYwQnBpREU2OHNISCs0MEZXRWl1Z3laSkN6dEpiQnI2blFZS3pjNE14VzRBYTVUc3l5SEpNenl4b0NBQVJidngrRTJXRWFCUXhyWkh4YlhrdjZ4dUt1UStFYm5qcjdDaGlpTGZzNU91THkwd1pxczY1dWdiWDcyTEhzK1NMekFCVnlWRDNOZHhaQ21tNGxOVk9CcmljQ0JkcDFudDRrYzgrREpXQzZXSnpGbUFaMWdYQWp3d25aSTc4ZGM4UjFwUXh1OFAzbHA2RHNxc3ZBbEpVTVM2MmRrVFVIUHZzRXJIeTFsYUpMS0FoaXl3VTJnSkcrZlB5MlF0cjN4anhWZlZwalJ2OENxODkwU0tjUkVXRzRuOHVVMCt1eWsxbGlRZFU1R2c1WkxWSXJWN2x6c3hUS2tjcHo2dHY2YU9MWHcvcE9mWWlSZHJhTzYxUDVRbjN1UjJjc2NXREFxeDlFOTdFSFhib1MvcEx5MVRKS0E3VWNhdlpsT2M5U3ZhZUoxNEM1a0ptcGZrR0VJWmxGUmhHMjh0VGlLVEhwU253eUQ4NUlHY2RVSDdud2taV1BnbkdLUG03QnhoT1VDYm92V2J4ai9rNXdqNWgzYVJyOG5SejhFUEpIM2J4R0NrMTUvUXJFRzh4NWh0aDBWL1pyOU96UFlJUE1ONFlSTFd2RmE2d0QyS2MzN2tuYU1FbkErNEJQUzhiOGhOTHlldU9VMXVNYlpNU01HeDNXVVVBeS9VQ05taTdYdCtwMWJvZVJ1aDk1RkNuVHR6V01VNERZQ3FIZGNYaGFvbWJMUE1iVjJJcDdEZ0RvekNLWERmSWliQkhJYkd1YjdVazlubWJXdEQ1b0EwWktxSGNXWFVOWDdiYlNPYVlQUzZtWTVUbDF5bjM1aFQxZTdyTkl3QkFJL0k5cUE5SXhUbEJOUlBYd3pyVVRRUFFVV1FRWjhnWFJWM25tS1pmcUR4SVloV1dwdC9IaEl6T0xXTUQvaXM1dUVnVjd1alkrYmNZM2NDT0ZOUHE5aFRTaENOKzdzaXlJOUdKbzFMbjJPVzd6VS9mTWZkVlkwUmFHVW5XRG9CQTFHL3hidEJHRCtUSCtsbGVyQmVFRXd4ZjhKM3Q5ZGxnODA4RWRwRlRUczRMamNMMVY4Vkd5MkN4K0hQNWk3Tm5Rdm9yN0J1WHJZcVNIdUtTOXlrN1BIV3VQZnp3djArRUxSWDVMUUJwS2k1K1ZTN2UrOVg3VzBXTjJzL3lTdVVsdWJwbnFQeDZpSWFmRVhqRTNvZklaVURFSi82L2drYnZTOGJZT1lYbXN0cFlGMTFnYk5saVpuMno3aFZCbUw2aWQ1Zmk5V1prTlY5NmM2My9YZXp5UVBodk95dTB2ZGNreTY2eG9idnhGOCtrNGozTVBRbWhuNG0wV1JFbzhPWlFHOTV5WEN1dDA4eTJjMk1PcDhrcUNtaVgxMkFLdXJrSFNlVmpsS04rODF6R2Z6RzJyLzR3K1pSUHo5a3BUTXBjbWl2N3BOUHpVcHh3SmMxb2o5MVlxU1VoV3B1a2ZmV3RqNXk5d0NpTXB6ZithSFQraml4VnE5T093dHZrdzVjTjkrNmc0YSthZGcyZnEzYnJBNm9Qd0x2bG1rRndhd3hienprMk4vK2M5b3lzcVZpY25KSTFGbnlManVJUXZKbWVUNHJKS0JEUlFUOXZMZnRUYWU3a1ZIcldxZUtwTFIwOUJqanM1RDlOaVhRN2RQK25NZG96UmxvcFNnL3liNnczQWw2K0VFQU5OWUt5Y3BkanhwbUIzZXFsVTBacVpRZTFFa3V4ZzJBRDMvZE1qL1BGeDBrUUg3KzBtOGVLUWlDdjJoZllzdUdtNk1GVWRqUDN5dTlHZGlONnlaNXhaUDV4YnRod3VMcGI2R1haU2FXek4wcXYxNzgzQXo1MkQ1M3dSWEpiMXh4YVAwZ0x3a05mODhZQnE3Q1ZucGV3UUpzYzFqUkdFbUh6ODlSNzJ3N0laVUYrQ1dUOENQNUNEbGQ4NFVmMzEyakJ5aTc1V0NpdGRKaC9iRmc2R25YYnVOUDZjc095WnQzbTdubVFkTmxnd1pwRVhCMDczQnMvbWZxZytwOVY2bzdUWVdkanRqUGs1MnA2bWZmREludHJxTlFVbi9uUS8zQ0lRb3BoMWV4ZVUxQkY2aTVZSHU5NXd2c2xZMkJHajBNanRxWU5FOG5MamV6MkRiYjRVRnlZVExhazJmM2pvVVhKYkFNdFBzMkUzQlZ6KzRZcFdpUEZBNGJNNG51djRyV1E2OHp2MlF1ZEw0UWZpSE9PVDdSNXdkaUUvUzEvMmIxMU1GaHBuUW5vSXZRSFp6Nkw3TWVqS1llK0N3RldLdVFTa0M4MXc4bVBFbklML29teG4zcjJSZU5ncjU2U1NVS1R2aHN1b0RaOXlXUGZFUHFkUStyWGFrSGFUUjVHcW5MTVFKOFpMT1BqMUNxR1ZSVVJrcUFxMkEvTXJLNkFqaDA3MG5ua09oUmMvNjJtRDRWUWxRQnk1bmZYTHZsYTVnaXJKVnkzbmovRDJ0T2RsN0Q5VWRndy81bEwwbEw1K2U5cmFESGkyRXFjbDBFRHc1ZVkrTC90b1hQR1ZsOGVGbUczRi9MR29CS25pNlVaeFBjM2htdEhJLzlmcFpYTkZ0RklscUNkYTR5YWdPUElicnhFOFYydndKUFJZaStvWWowU2pad2dZV21NamRqcmtyNGhGcUJOMUpjN0p4TzllY01vTldLcXNGTHpESk9USC9VL0VQVkRlSXJQZWRWVnFLa1BJSDRmVVRDSkwyOHhPM3JOMytjeWhWeTBjelg3aWhwV01LK1RzejVpQld2cjVibERxNDBIbUl4MEx2dzBVRElmSUxLdk9mVVV1YjJIZTdtdnVieVh6Uit0aGNRdDNNNHd1NzVJMG5PM0wxNXJGTWlaeE0zNXZBVzJvUXhyaXNBY1JndFdUeCtQSXNUNFhmN05jR1Fhbkcxa3lnMzE1RGVKMXYzM1VEN1ZBcC9GcThjNHd5RlFaVzZGQit6Ty9SMlAyZld2cnFHaVNMbFBTMkIvWFdTVkMyU0s4MnhSaXpWNFNRUmNzdVFocmJtaUtUMW0wNlMvZjdkdkVKNk96bzNnSm5OYTJzWWdXeFVpSGtKaWxmMWVKc0FWbUd1RHdsY3REUk1sYUdmNTRoME9KMGhwYm1GQlowSUF3Z0RmY2dNemFsdlJxTGpYUi9SWUhjNmwySFJDWHN2UFZRY1N2MGhuSE1pbERlUkNxTXVBSzJRWFFIR0RuTFBlOFAzbjNScEdLeDBHMnMzVGN5NThwYkpQTXo1N3VWMG03ajV5VTNBY09mKzlYRGZuWktGUElkNUwzeGZKRjBiQytpSzZvSzhMY2p2dUk0MHdnSVR1dWFmMWQ2MXlEUjlGeVJaVEFCU2xOeHNYbkV5RVNHNmJibFJTcGdaT0hlWWtGZDBrQXZUTmFvRmlBaWJlMTB1blI4SG1yNW1oNEJXNlJ1KzV5eGVpT0M1RmRZcmlCbU5IUUtCbFNqS0hRYUdDbXNVV3NoeXFab2VvanVrMDBIcE1JemZ3WUFsRGpJRys0clZYQURndStXUGNiZGdVNTQwbUpyQWtSdG9BanpwVFEwR0NXVEh0N0syem01cnVHM250MDBGTVhKbGdJVmJGQzNOZzlnMkt3RWVvS3JwMEFKMWQxRkRjY0hIYTJwbktLM2JhMXN3ak9qTDNpUjlBVkZjMUxPT1BpTDVqcExQbU9WUHRhMG9yNmdJbk9MMHQ3VlBYTnR0VVFHZ1pWdUp1VHdRblJ2bEtqS2xsNEhEc2RZMXhTdk1GMSt3YmFvemhnMC84Vmp3YllRNGxib29SQUtzbW1kc3lpd1lwOXhlczhxRDdpaDk5RGVjcFhUajJITkZYdGp2eTE3Z0F6U1RORHJVaGx3NUxjVE4zNFFFM0p0YXhxTEZJcHV4amxHTEN4a1orNjFGQWxLK3QrZVk4a2xweUFaVHJuaWdBaS9Ic1N3WWovWlVVL2I4MkU2c2YzMjBnYkVFTVV1RWlJRzZid1BOOWNGZXY0U3VWcTBwTmhhTmhIYyt1WE1adUtEcjIrbktVWllleU9vNEU3RHpzV1M2TXBTOUtXZEE2a1Y3MmtwNTZCOWt1a1MwNkx0USt3Q0tkbkp3ODJNdTRQWG41TnhUa3hGVXJaWHYyb2Z0d3l4dG95K0p4M3BjWDlyanN4MzZ4L0F4T2hsM1RNUThCZm9aRkdCWGxOdytQOTFkR1hoTy9YU2ltalZ1aGVXeElXeXlPYm9RR0hqbGdmWXAzaEJ2ZnBTWjlUeEJ5YmxISEZGemErdkUzcHlaVGVLU1dzaHBhNFdDMjMvVjRJR056MTVoOGt2anl5OUJvWWhta2t6RGNNL3hzNDVoeUQvOXA3N29EQUxoY1RCN0grMDJGREVFckxNWnhaOHdnS1BtZTU1dktvRmVENXdHWk9BSlNPaXZMa1ZTNU1zb1EzZ1MycitiTEJGWHpkZDlBRmdzams2a0ZlbUpiaXZrQ2E0dWpNaE84UlYyeENzS3RlWkVKQ1JhVDRHK3E3MmpOaGxzVWZBbE5QbWpZbHpvTDFEbmczbnE2T0pGc2xlOEh4d2VqMUdYZGoxcm1lM0Z0RUg2RTBhRkJFQ1NlZm5qdGxDL0UvRVljUlhuOFZXU0JkMThrYzdFOHZ1ZkpDWmg2Y2tZOW54dDU4MDdneFR2aWhJSDZ1WGNac3J4OFRnaHdhTzVQT0ltS2RQclpUdGJ2clB6QnpqS1NtcE8yWkQ2QXZ5QmZZUG9IY1h2N1pPTzRZRWV5NGprd0JQR3M4NEgrRDNJUmtqZlNSYUwxeEU3clV6MStod2I5N1hSanU2NkhwRUFEVGhycTVvakQ5bEQzWWVaQUZzeXJzS0tLaitoRnBUOUplNXlDYTByQ285ZXRiZHpZdjlRcW1DVnZuc1pLVW5WelNRbjFscFlzc1l0dHJIRmE0eFE0cWs5c0xQYlBLcWk5MzNhNlA4MkZaYTF3aktPZThlOFBQam4zTjFMZlltNnVwQXN5cThMUDlqdkFRdFBTWm1iQThmVjVTV1hRVG4zRkkrU1JFcEk4cHF3Wjc1WTFqRGY4R3c4ekVHem11WFVCOXF6NXhRRnJBejd5bXVXU29zZXhVWGtpejZmRENlZHBYK2k0T1Vsd2xtK3FCM1JDeGd1WmhFYnNldnp1cER2eitGNlE2QmpZS0lrb2xjNVZ6MnNtMUZXTW5BV2dsSEs0aFFRYmcvc2VqZ0xodGE4cVpvOGZMUTBkMW45S0R3SzI3SzM1TmtVd25ueVlvclI0QW13MnFEdzRxSmVaOUMzVVRSa1VUSEVKbTZaSisvQ0dURjloT1F6MGljekxVWHhBc1IvU2grUkMwbXltWW5TdTlWOFdMa0JwK1lkR1hmNjVVaEVHMFN1cDBnanVMaDQrTVJGS2tTUHNTR2VGSTZzdiszN1hmRUFoSU1rUVdIZTdkYkNjNzVVcytWT1RBd25ZbW1lcFNsWDBQOVMxdkZyWi92TVhvb24yYmxYZHoyTk1PaEpBVXV3UXNhUnMrTi83Qi9qMlB2WExPU3BZSUFwQlJlZnByUFpwaFpSVG1ZWURiWWtOWjRPQ1c2U1h4a3FxUmxkUzJydmRBKzh2ODBHVDdVV1h5RGdlSjFIL1JBd3FScVJWVkR2djNxbWMvMGRvQzhCQVdPOVBtSHgwdU5aS1RKY1RTcmYyTkhpTWh5VUtpVWl0RnY1dWhwZXBCYitwN2NSWitpdWpRWFptM0d2cHBESFVMZFh1cmFOMTZMS3JOMjY4VmJBN0lWYmZDQXRCRXU1dHluUTZqVC9vb0dVNVc2MzZKeWlyL2tIOTdvYklKOEJOZE5OUE9ENC9BU0pvOGlFUDNyWk1kbmF5bEY1MTV0ZXJXTW81N1lkb1RKa1NiZ3NBeDVRRHpYdTIxZlBkSGdOR0pkQXhkR2c0QzEvY3lub20zYW5jK0NDbm85ci9qNTdYdXNKL0pzMXdOb3pvZThYcFQ1NDM2UmtGV2VENFc0SEtubmVzTFpsWHd1eHFZSEZYWFU4QWpOeWZFZHF6MVIxeXdNaGozRjRmRWVsOWdzZllCSG1wM1FwMjRLd1k0R3VJNERPbU9YQkFFU1gzbUZ5cTljaUw3VE5BZlljM29UYWpBa1REN0ZSTDBCUWN4a0huRHgwR1RoRE1sSzZqUmRzZ2VGVjloWFRIMGpCdVNpQ2xBVW5aTUFsYkRqOVBHWVVDa2pydDVFdlRLTGxXWHpoZ0YxSWU3bDdWa0ppUnRhWXExNnFxbXl4aDZVZkhNRXRjRlE3QUZYU0JaVkU4OU9RM1hBT290bnJSVytrb2xhR0lKZFFhZ3o0clV1TFRqbTFaWG1FVFF5TmxUd1QxSW5nYUlEV1o4R0RLSjFvMEdyeUVUVHlqb0oyNXRuYlhYOFRYczE4NzNvMzkwZURBR1dkSHhVdnh1Zkk3ZXFvTzZDSUh4Tlk2Tks2Smx5SjF1ejRiWFViM3RTOTJSYnVPVkxPN3lIM1NVTkhzQVlKNXBpRVlabW5oSHAvT21zK2p6WmNnWTBZN29OdnRwWkhCZVVoNDZmbE84bkRyS1JxMXllbVpkV24yTWZGeTZYVFBkTUJXQ1cwa3QvYm94Wk4yRFU4K1k4blVwdnYxY0VEaHE4eWpINGlta3N3SkdXT3NhQWZKeFd2Rmdnem0yUUIrUW1mYzVZR2xoWkcvcUxCd05xWnRQQlhwaVFOcFY3amEyWXluQmd0eGVhNE1rSHAzeWt6VU5zcUVNSHg1QXdqdjhEclJJNndwU1FZRERyclB1ODhkWitESUdCWFhUMVpEUFgwZlBPclBiZS9wa1pjSE5YS1hNSTREQlJGUTl5YXdLekZGL3lNRTRlLzJneldaR0NSQXlQRSs1ZjMxRUN3aEVBOVcyTG1tcnFmamN1OEo2NTRIVkJLZzUrclV0MjZGdUlxMWpzM3pMQ1gvZkVmSFhhZWpzdTlWMlN6OWY3VXFEcUh5ZFJQSnMyYnNZWTNvZEVxSVRDWUROZ21tV2JNdlF0V2ZTbmVwS1lVRy9DakFaNGRPRGRNM3V1cUdWRFhSZE1qeHBzTVNCNGRzVHpXTnI2TXV6ZEJXSnNmZXhOOXRMem5vbHNsbkJTZExYNXNnT0czSVBVSXZNZHVxRjcyNFBTZWhYSHBHME9BNlRCZXhMT3hNem1nbFRSUUNmdzlQWEJUa2lKdFFuOGtVMGhPZDZhbU5Ydy9jZ2R4RkZJRkhMNFpnTzVzZVhESWNmZ2xTU01JV2srMWszSU4vcEd0TXNwZVdVZnREak5EMzQyRnBQTnd0emtBN0F1My91V1JSSGk2UmpXSjh0MDJQaTJtaWIrK2E3S2Q2Z1BiNnVLYkQxNEFUa2NuRFJaN1hOcHZrQnVPR0FIdXg2OG5ESU1jZUw1TVFMMVRyZFZUQTA1dlhGUHVUSzBPVFJVL2wrQjNJZ0QrQUhYNkVHaE94bzFIbGRSTXRzTHZOT1dTSGxGajJpWmM3Q215YngyTE1acDhSWENRKy9nV2xGa3E2MW9mVithVUp0dUwzc2ZlamduNC9OWXdnWE9yanoyOXpWUy9IS2VZdnY5S1RPS0lZYS9EY2hEeVNYaU1PMHA4dlY1Y3VJZ3crcjNKcXBkMXlhRG81VDR1a3kxbklyNUJCbi9ZZlY4VTlkWWQ5N2N6VDZURHBsUC9KK2RZUEtxZ29scXNzTS9jaUJqYzZOYjYvS0JvU0h5VkxuN3NlYXRpVU9PR3UrS3pBc2FUa3pOU041b2Y2YW8zVHVKRDJoS0g1d0ZaT0IrVDRuYU1Db0UwcWhuL1ZhZ3ROQzdmUGNPbnErMlNOVVY5T2QxcFlJMFRYODZ0eEZDcitIMkJyQjU3OEN4SXlCN29SZUhKQloxMjZ1aWxHT2tPV1pZY0h0Vit5ekhKREp6Njc4eWVENFJoWUdRRmJ1czh3cXY1NkFoR09TNzJoOURuM3dSbDBWSDVQbXM1MWFVUDhON1d3SWx0WlBQQWxEcGZGa0VpK3VnTWFaV3JpVkNxK1o5OUpTd2h3by8wSVNURVg5Ynk0MEh4ZEFpdTBDN0JYb1JQYk1kajhxUHFPM2x0ZDNBV2VjNGR6QVhyVXNsTm96ZGZXTXppdEVVdUVjVy8xWU1ZWEtIS0RObXMrZmFHckVEN2ZwSGhZSHZJYjh0TmNCNWRSemtrLyt5SVhzK0xJblFVOFlMVDVidmxwdktrNGhidW00REo2dnA1eWxZeEt5N2JvZzJoQVo0a2ZKT0Y5T0FuMTh5QUpNOEE2WndTWFdMV1hkMHRVVFd2NHJaMFpxeG9lWVBQVEV4NTA1N1BKR1FaY1ArRVlTTng4Tlc0Q3kxNVNkVTFGVTlubDR1aFRnUXBtb2ZhSk05WUc4b2lyRzFVeVJubkF3Tm92R2dEREJjdDZxOUVaVExjLzg1aG1JeWluTW9SWWgxNnQrazY4dDVQRUxuZ2U2a0FyN1F2UUh3TXYvMWJEWExxYzRpUUlBaFN3eWR0dlU0RjRmZDkrQWpYZFlBT0NlSWZ2MmVmdzhBZHZONnRCRmZRNi9MbEtKQjFOejNpZ0ZnVzRtZ1lFNTY0a0FmYVM0RXJMVG1QS3VxQzRTSzUyclJmdWNDNlJSQUNwc2FteURFb2p6WDRJSEx6aWpnaWUwTWVsakZYQzR1TytLbmpUT2Y5Y0c2OXFJQ2hkVGVGcjQzVURtYzl6bEE1S2RiZUxIT2hYTk00dW5ZQU1hbThhbzdNb01pQkNKY3RJTC91Rkk4c3JwOFpqYmQ5Q2RQOVRzY0hHUWxvY1pHVVRRUXd3UFJQMzJpeFlRRmVHd0dLK010UzBrQndLd2gyOGE1MU5rcjM2QjE4OXJES3Y2VElnVEVZNGE0TFFlVUZ4VVd1Tkx0cEYxUmhoN3hyZGhvR2U3RGtBN0NjQzZJTklMd29qek95R1crL0tZMGQzeitYS3o2Q1B6RU9Mclp5YVhzeGdKc25TLzEvcUFOQjhQUlZ0ZGpiSVNreGJJTVI5NjBNdUtBYmJFU2tvU1RQTXNVNXBteFhzd1pzVU9yUFF2UjE2Z2tMb25rZnVncENPOE1qemxhWkV2ekF2VHJXcGtTUVFwTnJYUUZqYXJ2V0RpZ2dKVzlTaXJ5R1ZpWkhrR1JGUEV4SXJjWHZka0N5R0tjcGhxOGJ2NWg3QjV2VUtpZTN1OGVuNUdCQnUwSk5oVHYrcUNySDVrN1VwQUpJQ0ErMCsvWlhhMHhCbWxuUzVDdWUvYTQ0bFRwdG5kZEpQdFN0Vmg1a1FTcUdXVDhDWUpIdmg5LzFVMERHRkZXdVlrZENiSzVtMC95ZnlDaXQ4a3RxNWhDZ05NRWFNbVpuRi9tMDVwdzQyTXFGRkt2MzBXZk1KbFBySmZYQ1dPc0xndENlVFpCVjZmdWlNL0VwQ0c5Z1Vab0c5VmE2TjFYMHBnZjNCbEg5N2lRbE42S2xIREtocUFGZm9NaW9sdytBR1QvRm1JcWZ6elVSay81QjJYYmhiNWJYMFdOTnZlNFMyMHYyaDNTd2IzczM1azJ2K2ZneFBTTlF4ZGc3d2ExZ2NIZXVIaENRWC8zcDEvQUNHQnBvR0s3QjV1Vm1UTE5Gb0xob0JLa1hkSGZhbFhYU0Y2VUd6MXhUck1uTElRUE9pazh3V0FBMy8rZ1YrUFdPeFRob1hhNTl4L2s0NUlZS1g4ZWVOY0E4RTUrWE91dkE0WFRBMVNKY0J4ZHJDeHBkeGVBN1FnNGVhUnYwd2s5QjNpcWlVZENjOTU5MnlDOGxsdjRwM0ZoM3Z5UmVBQ0g3OUh5a2tjcHhsQmx1S0lBRXRuV25XNFBjM0NCSitrdm9DY2ZRM2dpbXEvSVEvdUEyRFFUUmNhR2hYWUNvOTEwWEcxZWFyMU1EL05qbWxSZG5rS3VERDdrUDhyRk9OMkNyRTYvS0x4aGg3aE02bDBKekhGLzdObGNkM3ZmQWtDNHBOQnNpQnoxZ2lyOSt2amdJeXFGZkFCV2xvSFlacFR1SysyUDJzMmlYVjJ0R2NFcy90dHhjMGl3OGkrVzBlb2xvNG5KMDJmdGVWTVV4VHR0NTBvNUxnUlE4aTNmeFdGemxsZFBOK293WmVwelNKOElpMmhKYzB4VXEvZWxybHF5d3B4dTRkdENKMXhUcWRvd25OVkRSdmlvblhUcGU1c1ExejErZXVRU0l0WWFhL1VFRHRJRFg3bkN4dWVrbURHR3J4UVhtajZiVVhHTFRObDM1b0Evbi9ZczJzYTk5UTMvc2duYzBLekEyWlFTY01jTXhQazhoVWdDeUxYY0VrYytzd1JuNnlpaFhnUVk3OVNpaFpSa3d1bDRvR3ZIdGVHWkk5RDlGaHh1SC9UKytIWnZ3QkhUY3Vob2J6M3BVOUZMWEtzM0lqNENlb05Wc2lVVVhMV3NJMDNkTVFGRXpGckw5Sm5oOU9mVS82ekhPQWNIQUYrWEtraGlMQUJrK0R5NVlrdXp3bUluRXZZbjdzb2JvNUxSblFsL1ZpVWptYXJ1UGFGakhQZWl1Wk9zc09aQ0l3U01iTmdmSnVNclZaNFlNUXJhL21Qc2RaNVRFbEVOSkxsRDdwWnBSc05hamp2R29SNXF3ZHFicDErUFdUcCtQazBiNnZ2Y2w0NHRlZUFmazFWVkdmSjFkOEc1TThtVjdYeVF4L09UZU9mNHk4WEJoViswWlFFMzdFWHhaY3BUU05FMWw3RWtHMkNxUzVoR0RiN3BFSFpZbzlmdkV0WTRhaVQ0dHhQMHBjdGsvZXBOMDhveWN6QXRYM1lkNnVkM0U2L0JROEhQNHJuZnRQbXN5dytuMXNLWWR1YTJ4dFd1NVFPbkFBdGhDU3ZPU2t6bmtWeG84UVdHeDZCSEJxdlpSY3l3VHBtVGlrTnJsYlNFWmVuRElLZkR1YmRGUjh2Rms1ZEdFL2ljTG56cXduQTlTaU84THVTMjNmazBueTRFbXNxSjJXUDhGR3RLNE9ybm9HcjVzN1pwZFBXTm1DRFBybGZWNDh2QkdYVnZFa01SUGpzR2FvNm9WbUl4WWlBNksvd1M5Vk8xUlIzK2x2eVlPbnovOEtPTXN2d2drVEpkNnNnYTFsQ3Z2U3VMS1dOK2g4NlNGQzhKYjMyYlFKZmxHOUVRMTdlamlCMlZ3WHlIOXV5UzBCTXM3SUdZWDgralp0MGFCWXdjcDVsUDhGdnVVOVdZWkdxcThQdVBVa3pVMXdrZzNNYWtNRXpoTThyZEp1bXJLcmpLTG1DdkplRzFaNGJBcTNkdTQ5NUYydTkyNVp6Q0w1cHZtQjVaMG91dW9WSmRaa1dPSG9kUmQ1djFnRE93LzVmd3NHRXpXZkxYblIrOWdVU1V4bll5dGhMdEV5Y3hVM1hDeWEraVFQZVJxRTNVVWlLdjZSc253Y3FySU0xS2ZtMTEraHczeUNURHl4MFZIZHgxMk1ZQ0VlM3R1ZTRmT0dEYTZjSDJoSGxiVCs1WnBOL1B0QXl0ODlFVS9BT2t1b0Y5LzJpcDQ2UjhPcC9RU2IvVk9WUzhjanZZeEk5T2FRQ2xWU2FkelR6cjgyU3NSVy9GRWtKQXQwSTFKMGhBTitUTTlWL0pVL3l1TmdMNzRCa040TFZrOGt0cTlyMGRtbnRoRmhFajU5bmNWZU1CL0VQc1lCeHA3Q213WCtGZXZIcWc4eXNnWVg0RDJZaEloSFpxclB2T0FaTjVNY1BXWjJMZDJ0ZXJvbUlKaXVLUEZKbWVJb3c1NmcxZm9MRi9mM0s2YXNtM0FhRjhMTXZQZXhtOHk2M2FGSzZTQkVxMFB0dzJGcko1Z1orQlorM2IwajRSNnVuYnI1emNwa0Y5NTdQSEFTT1Y1c3pxM3dqRHlNL1dHLzNRZnBjVHBiUWVzaVBqNXo2endmSW00NFZzYzRwRzh1MzJUbjI5ZmEvNmgzUmZtZ2dWK0xjZnc5TnBIb2p6ck1KWGNwczZ2cHJyZXZVenRERnVZZVFtb2V3K0xTZkc3d2VmZlovaVh1a3ZhcVVsYnFTaVhyTUxOU3F2Y0Fma1FGL21GdVRYSDZXdEEzQzNIQkFFZ3BJRU13PT0iLCJtYWMiOiI3Y2MxMmQwNTk0ZjU2ZWJmYjgxNmRmZGFjOTUxMGQyZTZhNTE0MzMwMDgxZTkyOWY0ZTljMjFiNmI5ZjRjZTg3IiwidGFnIjoiIn0= \ No newline at end of file +eyJpdiI6Ik41eU1ZbHlFWERLNFdDeE9jZmhqMXc9PSIsInZhbHVlIjoieTBaUVZRbE9HZEJjQkV1ak5kY3ZSRmpZNzRGR0NQcVVEeDZ2WjhJZnlvVVBwRXc5Z0NGUEVOaWlQV25nUE9uRmdQM3BBcE13TmlVVnRWbEc2V0NIaHhSS3E2QzZHczV0YkRBeDRNMjNuQXlyRVdWRXVwM3pFZmRNSUhKbndXdVl4UXF1R3FZdWlzcWhGdWlYVnpBcWhFeU9lMHRnZ29jU1RJUzBpbEdKOGRWOTF0SGszREhEOUJNNGh5VlJ6U0p1NklvcEUxdndxZmdoMEhVZnQ1MHdsVGN5YXBaZzB2M25mUFBja1M2TnhONE50OW9ZZU1xOW5VVnUyR2FGSzhmbXNaN2ZtYTU1SUZ6bGVWRnhtdEo5OUhVSmd4Q3M3RnJTS1NxT1ZoWXFUcEpqVEU3dVBPZlU4MmNudm8wRW5jQkNGb1hZV3dxa0JjYWxHN2RITUNCYXlQS3lMdm8xS3ZGSVIvWHpiQ0kzVXoybjJZNURGa3I4R21ubUI3SW53U3ozU2psNExzRmFBYzRwYWd5QTNpZDdTbkhUd2VpRTB5QnVaQ1BjVzlucHJZT0h2L0xjNkRsOUZIVVlPc0N6OTNZM2pJS3ZFZWk1Qk5vVm1ndDlmNDhGcnM1cHlqQjl5RFhXN2QxbmtRRktveUpndFFmNEg5bVBUZ2k2YWROZ1EvU005SXpNSUFDV0R3MHhaSm85MGl0QkJSN2g2dTFDTVhNakExbXN6MzZENTM0ZjNzWm9oUWMxS3pleTQzcy9EQmZEMDhZcStHZE5TeHpTNEM5R0ZTOU1pWEt6T1daRTJWYlFTeVd6WUpPdUVCTDlNTGhrOE9sT1p3WWl5d0pKbkE2TzA2dWFSTmJ6MkExQmI2Und2KzJwNzVMbGtKTElrUThvTVRDL2htRG1TUnFBd0pOMkpjYTJXRzRHUDRvQ0xPVUV0S0JSRHNXZXB3M0g0dnB5ZWFEaUtaTlg3c3BYRDloa3ZUSXMrZ1pDTUNaK2JkM2RzTlBHeGZpQmVadDV4dCtyRW5XV1lyNTVlUFZyeHJiZDJzTmRUZ2toZnFUVVJZUVVSUXduTmFiME1NQk1GYS92VkF6aDc1K1RXSkpvb2pWZGo0VXUza2pKcDBPOGdRT2lUWjNCNS9uOGN4T1RsZGowYjR5WlRoY2NCVEJWRHAxYlNlT0dQOU1UTjhwcHVXR1hHTTdCaThRTGRvTXZDem9TK3FwbkwyREpraFhqd1BaSDFZS1BScytXK0FuVjVyb1A2dVV3WW45SWViVjZmRXYvelRnVURTajRCNURRejNUcUhHSzBkaitjR3pZNFJCSnMxQk1zdVlZZkt2U1pBOUlIOWllSGFSaVA2MVhSamlFa0NCUjZ4TmlxeEpKRWZRdlVyeEpjdTA3VUpFeHJYR2szbjE2eXB2WmNtNExpS1JCaEZGakdGRmF1SHdhQXJaM3ZrdmxQRXRka1dYbHBnWkZZUjVmb0x0TjZYQjRQK1A4YWJiWDBaQ1JOd29NUGp5d3BvU0Q4UWk2RzBPZFJBZmE4Q0RNRXd0UG1NMUhzNWtaK2FnWElacFFTY3lhNENkR0QrU3J3NkhGS0ZqNmEweDJ1OTd5Wmp1WnZLT25nb0t1U0pkVEtjelEzWlE5dzZtNllOYWZqeU10UFAxNFBEOG1IcVYyMmhneVdxOHpFM1pRZVpiRFFkMkl6STYwQ3Q3MUxjNnU1czUrUlcwOXprREZiVWthMzBqb2src1FLd2F1U3lXamhiUVUrRWdGSEJ5eWlTdWhqVTV5WnR3aGZGYlRTYW0wYklaWERnWmZheUxTNHVXclQzMmhzbExnMGdPOVlPSWZNMUp5c2M2Q3RUSVQxUjI0WHY1d2IxQ0JPd2VKbTVoZFFYNjdlK091bVhha0psQW85K2NubjBHTTFVdk1xWDZobDBlRml5a1kwUlNyQWN2TlJ2ZWRuZFhoSTdJMWJlWHI1U1FlUHNGRDNRT3dPZjRwVlVNcVJlM1poblhXWG9TemVHK3ZNZGcvbFRLa3I1NEM2d0JBWjdMeVVPSjF2bmxmTjJJRVlKWjRSTkhPZTBiZ1YwV1JmZlJHRnJoRmgvMC83NlVqaVlFOHFFZkt6SG5XQi9BQkFOMFVrL1YraitkSkQraXBHN0xnM1EvaE5GWTVXOG0rOWJ6eFFsbEpOWUY3NVdpeEd0YlFBbG4vSFVjS0taSUQrYTFlc0dNL0xxbi9YQXZ0T1hMVVRqakFsQ3RqejB5ZXJFbnNpdVhYRXU5NVVGWHdVZVpjS0VvNUVqYkZKYytabzVFSUFUa2VweGM0T0plL1U0WFJBQk1GSm8xcHU0S25QVVBhTFBpdE1oa0hRK2dzWFFiL0RQWHFDUVduSnhGZ2JmU0VQNE9oZGpzeDVTeFQ1OHE0VTIzL3Q3WUhGTDF0NVRrdGlVQkxmVXc1bnFoNE9aYnlUTjFSU0hCeWQ0eDVpMjdxbzI1cUdVRnFFTDgzU2ZpTExsdy90UXZuZXBRbzUvVEh1eG1SMFZJZW5seVdtSGtwWTJ2UE4rMVROTnhOckxmWDFRQjhnRDlVV0hVYjVFdXh2Q1IweEtqZjRqZjMvOTBuSERteURIc1NvRXlxNk8yQ2NLcit4RGpTKy9rQlNyZUVOTzhQbXZIdm9DQ1RVVWwzbWswOFpmeWFCZU1uRXNUMVQ0cWNwamRRZm1nT01wbnB4K3lOZ2h0T28vdzc0MmkrK2ZVWTFvOTJ5OGhPYXJTU3JoVWFRNUpZVG82ZHBtbzhLZlJsZTlHZFU2NFdkenRYd29yVmNYVmF6ZzQySHF5OXdwYmNPWkJ2aHo0Y28zalZLMWxwcjNlVlhoOXVkcm9BczRIQjBUN1JmemZjNERCMXFqVHJaZWR2YXZrcERNOUV3VU9yRUVWVlh1YysvUVYza1NSWHA2ZDZvb1VEVHF6QTZ5Z3hONEkwbWl1bGFNdnp4c1pqZVV3NWg5MXZOb0V6OEdRRy9iTFRtVUxERGNQWEdlS3REcHFqOGdHcGJ3OWp5azZZbWd3cVBZSVJHb2sxbmVJdGhhVk0vTEJDTTBVOExicisweGg5NU85elppQW9yMVNuVW9qMm9rczE0alFtYXJyc1UzZlRHTjF1QjloS2h4SVhFcHJmQnkrV2VJTEZjb1ZXNHozT091QXZxb25wMnBXU3pPSkpidFd5QXlLM0tlWmtiSDZuNGNMQXJ2OWt5OWxDK3g2VlVVQ3ArdnBoWTZ3MzZjYzdONkhBNGU0YTB5S2dTZ3ZoNU1ZaTkxcjFRbGVrNGZJSzZBempwNmV1Umt0WExSaHFWRGtLVnRhOWp6Wnc1aE5oV2FoeC9ianZ1bm54cnJ4Z285OVZ1QzMrbmZiVUtPU2NlSnBXYVdEcFVXa0lkRmE5Wm5hdEVnWlZMTEJYWE9iTnQ1RWJacG4zdGpya0dUcXIwcXNMN09QTXVvUXBoQnZOaUhkYzhMOXI0Tkd5VmJiRmFvMGJjK2xyODEvZjY1K0d3bHZHNGhDMGh0TUVIOVQrNEN2ZjJJUVZrVk9TQW5nUUdscW4vOVFpTm41WU5nWjRxdDZxK1VvbThRcmg3R1J4ME5kbXd0MDNPU05YZXRLL09IVGhLYjdHRUg1ZHQ1V3paNDNvVXF0UjlVUCszWFUzUWJyeStKemJtczZHc1pxNmc2b004RjBncm1HQ1JiRXVkL3VCZnBidkpvMzZwU2pUTWRQUVVRcVVOQm03MjZzWFdXYjRXRXpVenJiRzFjZHRva0tES0VZUXlLMi8xZ3VraXlqZ3QrUkpLN0htdkpMR3F0NjZpUXhHL0RuYUkvY1UrQ1VuRDBWRzNiSVRrTXNmTEsxTFJJZTRkcWwrOVozN09TZ2FjenMzL1ZRWVhjblNFdStFMElXYlBqUXJ3bmdLWlh6S2E1UUJjVmZJcjlhNVNyVmpoclFDUjhxZHYraU1tOVBaSkt6aVBWQUo2bUdRRUErOXIrR0lkdEpYY2xOVEpuRjl1UDBzOXhBTjBTd3VvamVGbUdnbGorU1o3bjdKRklJTXNmV0ZJM3JoQjdJWjl1NjVld1lDbFJwY0pva01teVhyQ2dHL0toc1pjaXhqZGQ0TlcxU2l3NWFKVUR6b1VqWEhQYlZpMDRPdGhnYmVvQnBkZ1RudDRWK1BxaXZLRU5sT3pBNFlBNTFJdUlobk9wOTNNcnBoTUxRaTBPTnhlMEU5VnEvMDZ4Y2ZBWjh1OHNLaDZKdTRoTzgwMWFoWU5najF1dW9GQzJFS3ArdHA3MHJpZEdMVC9zWEp1VVppM050dTBWOGhRdDZlOWVYbzhCMGMzem9tQUdNMTEzUnhMaStqbnZrRVV4dTNESmlrNzNQcjJhdERPNWttTXVOYXEyekRlMEw2U3NMSlZlNE1tNXJ6VmVoSGdITTZlZVZBWitOQU5SL1hrLyttOUJSVm4rZStMZEZKdmllSnZKOEFnbDdDY2pxdHc3UEc3dm1jN2Z2Z0lFcEpsUmZXQUt0TGU3RlphbVc2bnRxZzNBTDhrSXRFUk1jcFROenZvaXY0S3k1VXBuZU5wYTgxRk1LMW5uSEZPbHp2aWgwcTZLM2pURDhtZjNNa1QrWlA2NjZZT01MWFFPaThHcGJlcVdLUEVtWEk5aW8xMmNaK0VtODJ2UVI5Ni9JbkpWSktaM0lwdEkwOWdlcG9OMi96K3VsN2R4RC9Tc0xYYjlpL3ZXc2UrQ0FTK0JzMDl2Y2Y2djNiaFhERTVwVHQ1U0FqTFlPRmNiUnIyOXRQckJWQVN3RVR0WVk0YmlSbGNGY1lnY2FQTjZ4dytLMEt1RWpWako4UWwxbnlaNVVyTU5HdS95cndTeHJDVEs4Q3BoVzZ0bkRpanFDNUxnUlJVMENyTnBObWxKVTloUkxFYWoxR2p3alhvU1RWTVFVNTYvTk1wODZuaVJIQ0toOGRsSXlWd2grS01uTVFVK0dmdVVnR2xXOFl5a2JkTGJaSy9hVGNsdm82TGF5RHR3dUdNVzgxcHVIcjFmajFvZVFhSDlYSkZ2NDIwZ3NpenRKZ2IwME0ra2pYeUVPYnowTWRLS3hYYzlnc0ZPRi94YnVmZnRDQ3UwWTdVUEVWM2xLbVM2dGxHNU9vNnJtZFNya0xLY3FsckhFb0M5VGlBT0h0RVZKeHlmM0FhQUhNRzFGL1dRMVluZnR3NDZHbmxOMjZoM3FVbVM3YlFESmpmM2RocTN0YXpLOXM2QVJnUmZIV2tlbUVzWU5KTW03a1NEL0g5SlpkcFNpMVc5Zy9qWkxOSTdQSTNteXd5bmljdldKUnU2dy82T0drUm9xMnoxcVEzWUJRTkZSUG93Y3FTcUpHQ3c0SXZFc2U0ZUw2K1pEWkR4Yjk5VElkbGw1OVUzZXNIUFB4cjZ5YWNYQ1h2ZUQrZE10Z2NzYnFQTHY3UmgvMHpNL1RudTVFeW4vbFhEU3JkaHlKV2liWEhpOWdDcWZQMUw5ZHFtNDFWWlZMMHpDUlJaWmpqTWN1cEtYS2UrZFNDYWpVU3pocDhPYTNiM2Z6empSRjhvYnNzTFY0ekdxYnpuV2ZTMEFncXBmWkIyVDF3ZTZVY1U0RlNKelFNMGIxa0FWSXg4UkhjMEJYZFkwa0Vta0ZSelplV0FOR003SUZISFJRck1jUDJPSzhoYkgwQ2ZPNisxUHYxb3gwZXlyaWUrNTBFLzhJdDIwV0hnUDJuY2lJclk1aGdpZFU0Ymc1TmZGTituazF1aG5Ua0g0SkRKQVE0OEdqcXU4NkVuS2w5RzFXV3JhRkVKNXA3dFh3RWk5MTAwc201Vjg1VW5HZVVxdnMva2ZINmg3Q2Z0TkV3YzZhK0wxKzhLazdPdVJHNlB6cWF1MVpDajdQWXJTQXZDSFArQWpMRW5RaFZISmQzd3U0dXkvMHlQZ01TUlhMcWg2VW9pZjMrWWhlZHJhSHZBZ1d4aHpPdkdBRS9xWDg2OVVBTkFZZFdyWnBockdHQUJPSFdlbkY1RlJhVithK05wKzRTU2ROdmhwVDJFVUkwSVRSekNlVFdZaXB0eFlDYVk3WUcrY0lUOHFvdEE5TGFVd241bC9XQ2Zkbk9sZVJGbXJqSUo3azN2WEp3M2dmSnFudzhZZmViQ2FSL2ZhTi9MUk5raVRsaS8xSGhxNTFCNmhaT2N0VnAzRjBLcHRiWWFOeGY2akthb3B6WDNPQzZHVHdySCs4TXFKYTlLeHZnN3NoKzFVM29TbnFlcWxNN2JNT1piVkdCSzg3UXBML3VmTTZGOEdwbEtoa1JSdE5Ock53RzEzNWdnRUFUWHhTVWpzdTRKa1NrNWt4U0J1VWpueUVIK3B2Y3greTgydi92ZjBRVy9iRDU2cDFZS2xKYkwzeDY2V3FoclBYWU03MXJ2dSt2MWdNMWNjOEx4N0tXY1JmdjZIeHZWLzJ6bjJhOUlaTEVqSXZaWTBjQUF0Q2tkVTl3dHVKamJob3hxbDVOZFN5eXZvRURtWUJGTmZOTHFUSGQxa3Y4MjB2WEZwY2loTzVUOVBhbVVnZlpXL0p3Y0pMaTZMQTlaZlZMVGd6aVJVVWNGaXJXWlc1NVhrd0lhNThhdXl2MmpYTjdHdWljYVZwSTBFWUVvQjBLMGxQck5ReEI3eDVNL1BFRFJDNVc1Q0ZRWCtvbXY4WVJOd1FDTlZLMFZkeHQyYUZTNXpoWjF2bVo4bXFON1g1dUlrQVlTQUNMdDVPT1k2TDVhOElYQ0t0RVNCWS8vSEdtVnowYmsyblZBTVVJQzVmSmRNME02R0FKN1JhS0xMQkVFeFQxbDJWWEVNTXZqMmgwYkJDV2hPL3dDRzBuQzVjN0VpUDc4NHVWVVNTVFRwWUNsYUQ5SU9ucHJPQVVjcU9rQXR1TkVtck1WV3dMYkoyMWx5NE1QVGgxSWd5aHV3d2s5LzNNVTR6a2RCM29jSjV4ZldnOFFZL1lEYmcxUFFFb0RQUnliNTRKTXZLVGx3OVpDNWhDVU9Cd09TZFdYUk9WR1FwUnZjQStmRTZiTTBiQWVGWFJjM05WL0p1TnpLQXVoNnh3SkN4TGNUQ3BRWTJsQWVRZnI3TVg3S0tydHpBZ0FocElSRlE2bmNVMXhWWTloRkNVNytiRnNKc1VhZ2R1RlY0VHVKRXJnY0hEMHIrMlNIOTREblhCbktWVFZGbitDQUY0VDBpZ2pFV3VIUjlIYjZ6NnR4MU41QjFnbjFMRW5VbmJvb3BSR1BEQ3k5bXI0ZDJpWmEzc0FJd2ZBK2RPSlA4cm9sOUFwc21LT3NYRk1hdDdRcmVKd1RNU0IxL1BXenE4VURVQVFycEo2MmRlbjYvZkJ5clRyWTRIKzVCZUF0WWxFNGJjaGMrZ3dPa0MrdnpkZ285anYydzQyTW5VK0MySElkSWo1YVFvVzVzNzFIU0d1WjlVdGpuSE9vMlNVTDRKcmwxUW5RRjZNaU1VbGpPZDJNN2hFOS94eHZESkNRdWdGRGhQT3ZWemsrR0hBbUc3OEczandhR0hWSXJzQkdqOXVyK2QzN1dDQ1BxQlQ0WUMyMTh4bGNncTJIeDhCakE5bVVsNmt4MGw0K0hlSzZ1dzhoSXFhRzUxNEdyOWQxRWdFQXAwd3k3R29EcjhLVkwzdUtGT0R5TC9mQS85V296WEZ3QnlydVkvTFZ2S2lQSzBCK1ZoYS95SnhreXZNODdUcDR3RjNUUzlHM0oreGNKNlprWEZuaGtVZUhUcjZzbUpwakZBZEpxd0c3czRSTWRTalRLakFkaGVCdWkvQytKUlpybDRURHlBbHhmaTdSaEJSem91QlBFYzZvVFlTTFcrQTZJU0xGejYzTlMyU0QvL2tMSk0xQXlkWkNmQkRSR0pYN1NodUdEQ2hmMm9KSWdOSnlVbHM5MmJURWwzMmxwTEtuT0hraHAvbWpmaVpXOGxhSmk3RE55aDBGQWtvbU1iWVlaUnZJZWhBdmU2dk1yRS9qaXExZjVhRndxOEhFazBNZEhKYWowMUxqcmpzOXg5WFpqWUJBT0grOTdTN0NPZm0yYUpURnQ3YlBqQzNuaUpRbEkvdVp1U2V1dFhCaGQvbG5FOCtSRHBEUUoyRTJkRE9Tbkg4dnZxZDIrWkU0SFFPYldrbHQxL1VYUThhZTBBZllDSk10b2ZKL1FBNWRBUVp4Rmdsc0dUQ1lINW5tUEJ5YTFXcnU1VVR2MGJpVlRkMWpNVFJXbHJCZnlXVGVONllRT3djWFViM2ZiT1JxeDlnWUFaU09qYWp0a0RBOTRGbG1jYStsaVJTdzczcmRzV3JvTS91aGZzdGlEMlJMeXBuWDc3TWtvU05pRnNNR1h0UCthSUlZUURrT1dPVFovdkZMeDhRQ29UcDhHYUprcnpsazlGOS8xVkRWWUxONnBqc3N3a3l1Z1NKbHEzL0tnNXFnTTNoeUp1M0lVTUUvWVlNVm9CTnlORUZna2J1VlVIYjhoWmVaWTY0UWtIcWovV0xjdlJIMldvSXphOVlEYWNjSXd1ZzFWZHpLTjhsY0pXcVY3MG5Nd1pmTUM3b05oRVU1R25NdEZTS01zNzF0UkdDQkFYOHI5c2xTMnVzQ3BYeTJqclEyYXV5bkN1Tm53eWx2OElHMnE1R2ZTSEJBUHZ1Z2UvV244eHN5bEx0Mm91NGVWei8vS1NSU2lrZisrOWJDbGNLQUZmZEppU0owT25mcmY2UFAyV0lkYUY3NnZSWVlJOHlqcTlxdWdheEs4ci9tc1k2dWhMV2I4U01tQXdzQWFIeCtTRkVIQXZQTVlGQ1FlV0hMRzZiajFRdmF0S05GdGVkbWNLbys4KzJ3MG9EelExTGdpZ2c2amNMcnp6VDd6Z2ZGOXNUc09tYkp4QmJJV2MrQi9iOXBMdEU2T3Q4VzdGc1ZLV1F3YWYrcHRFMG85M0tONHJyNXh5My9KTW42NWNMS0hyalJGWGY1Ukh5eWdTVWdSMUlHY1BVRWlCNGJsT3F3YXNPZUtFSmNkQjVBQzRQc0pXcU5CcUcrY1Bjb3k3RkVqeUg3clFTK0lJUW4zc3EwSjVxdFlzakJ4bDVWbUNpZDJCVmF6RmRRS2Z6eFVCNUE1ZE4vSGVoR1pYVGpvaFRPU01UM0xkdTcvdEJ5Q1ZCZ0RzOWpDNzN3dTJvcUIzSnkxOUM3TzdBVUdLaWVBalFlUUx4RStWeW1heTIzcW15ZkFmQXBRWElId1NPcWJ4c1dub3JwR1lnam1ReFIvNitWV2VKQ0MxcWhGT091S0tWc2FJQ0RFRXlJY1dkYWUwNWN0SUdBM3BGWU41ZEVFaW4yWkl2VS9JUy85OVl2RDF1czJSeWxQZ0dnTm5sV3dDL1h4dUpKMHRqeFF2UXl0ZUpRazRtSEdPTDlrREpmUllHdFZTa3EvMXNWclE0SzV1NHpiQVhiTy90YUM3ZDhRdGs1bWo1MFBuR2V3TERHVHFsd2ZuOHcxUE9lT3AvWkMvTWYyTXMwdXFxcURjeEZuNDNCVnlkdnM1azJacUtPRWN1SUJVWTZtcVhab1lvVGp4aGMxMjJUTFpPSWVJbmF6WU5uWUlKR0xBQncyR3ZQVFFtOXViK2pyZHNkQ0RUMmhUQ2xud3dKclhWQ1VPeGNnQ09vTzZqeStsLzZzdC9DaDd3TFBrb1Byc1hsS0xockd0SVl1V1lUSHg3ZUxPU3hhckF2c1VVMmV2Q0hibFpsZ2VKeG15SlBuWlBFK3BtSGRTRmpzUnZrVGpDSTBheFRZT1hnbmxYWVAvMVI0L3UvVTB0alhWWW1uRGM1bFRYbUpkZFhHa3BMdGg3dHdtcXFWclhoVXhDZDVrS2ZIbTF2M2JWb3I0QUZHQ2EvcGU2SEpwdkJGVERqUFlSdWlkQnpQMWZmamJaYVFZL2VSdnU5WU9kNGhBSUJZd0laaUxKbFBLS0ljcmhZMWdpYnNpSzZmWm9sYWlGK2IwaXpETUxwaUhLN0thcTM1czhLc0J1YXJHcmUrSy9WZldZRDdCOFhKbFpLTTdSR3pGcE1aNlVzTVpEM3FDWS8rRzdDV1hvTzVMc1U4SklDOUNJUG9BeTl5c2lNLzEwZ0txUzFtVVAyOHQ2c1dyRTBVOXk1cmNqQ1VJd0VvR0pveXd6emdxbXRGWUtxbWxGMmpEM0lZZFdkTGxDRGN5NWgrVVdUYzllSFYwNXcrVC9Jb0dJdWJia1lxcDRNdmdtYXlNYVlSUFUwSVVGVE1ZWHVqaWlMZUJMWlU4UTgyQ3ZLeWhpNU01V1JpK05PYUoyRVpGdTM0UHlvSWFGMFdVcklkSDBDM3F6TlRTcXN1dk5uT3NoMkRCa1NwMnFYcFVZMGF0cDRvaXFVSWU1bWFhTlZmeEt5d3dlcGJrYzcrM0s3U0xwYnhYUjZ1MkRYSEc5aUo1WUNjZElydy9FZk9XQno3bDMybFMrQVplYXRRU3ZyYjdmK09XdjJ3WjRXMU11TGVFNURBV1dkRGt2S0tsTmN1blhPS2Z5dEdOUnc2QTJvSU5qeWNOS2dKQURXVGcvRFZGaUdBS0VScisvQkt4Z0VGeTYrVUtNdG1Vb1RnVmVKdkxQbC9uSE5RRGxBS3NBcDZDQTJzYUowa0RvcmxRT0txdXN5UVVxNlB6b25KMElHVW9jdTc0cmlURFp4Wm1JcUxPY3dPdHRoc0pxZnN0UjRpc3FqK2pGeTNOaUF3Q2xhR01XYnNTeGZXdFh3NmVQdDdIUUhwSkpFNFFXTW40end0SFM4R3NRTmlzMW9BeWxCUTZORkJvRlFxRzNST2M3R0Y1VzBpVkVUR08xZjZCejdvV2JLcVJGRFhlUjhFVzFxVVR5OWNNVFJjNkI1YmdQaC9VYnE3SnoxMklyQlJxYlZHVXhuQklkYkRsWnRMekh2Q0sxN2dvUXBqcThqME91ckE5eUdRcUFSdURNVkhYUkhYcnd0RytEQ2RYMUdxamp1S0NsU0hHVzkzTzU2SXFKcDNZNFZtQlE1bXBTK0o0UTNuWGtEeWFQRTg3VFFkUVNXY0FCb2NzQW0veEIyYytzUVBJVnVkaUcwdHlDRVE4QzlRUkd0MnJXZlQvaEJ0RmUrZlE1VUNtdm9ubmcwY0lBeFJZVXYyVDNnaE9yejFxUFpZOFpIYURiblNJZHV2S21sYjBHSWJnMXZBbVI0NHV2OTY2S01qL0lZalVhSll1NjdIS3l2T3ZaRGtHNjluQS9oWm1Vd0hVdENrMXNuejlqRUh1MUgvK0plM1hQYVRwK1lvNVBPV3NXYytIcUxUU091ZWx4YzlCK0tVd0NaL0k4ZHBNeERpa2xYaTBZV2JmVmpvaVFBOFVUYjlHbStoelpJL2NHcnptM1RPMVRVTTNzcDJGaUt4U3FYSzMwUEZhT2dPQ1g0ZHFKaW5rN1BYMWJvaVVkM2h4TTA4Q3R2U0hEbmx2TVk2aVRXVmNUaVhMc04yQUluSHB6bmxnZy9CZmFoUldOYWlLTEpsUXJDZ0lYQmJpdjczaTlWdEpEcG5vaHVuV01qeEV1VnlLRGF5Y3J0OC81SGlvam14TXlabEU5b3ZjQzFQcEsybC96a2NOMDdTb1hvdHJGZTdEVGNtVVJORU0yWHlzcUQzdVhBTUlONkgvQlZjNDVMYW1PU1RjTmZYTEZhamJXK1EyV01jcXZYUUNPbEZ3Nks0YzBtN1hsVjlXV1IzQ0wzRVYzVDNLWFFMNlpNTU1MdThvVWE3YS9Ub09PRzdlaFBIcStSbUR6VENRTEJySEFwakk2cGIvTmtkbEZtZUpBSlFyditJSFpyOXFxWHd6NWNHUHlBR0NGZzdneUtjdVp3Mld3U0pmUDM5amt2RmdlMGlieWYrak1EUGx1U2oydEM5UnV4ZXFiL1hyd1MrYXU5WUQrRWE0SDJWMGR5d1dmWkN0Y0l4NU56cURkbm80eFc5VU9HeWI3STJTYWVZRHdVSnVhcTJLa1pPd1ZPejQ5cTdTYkdtWkZVN2l0aHAxUi8vMGtOZ3BXTk9nQ05vTlRsRE9xdlBpZHBiYTV3WU5RRFcveXloZG5IcitnVmpTbkVkOHZHZVYzSmx3dTN1ZEpUWGpxeFl4amc0U1JRa2pHSnJ3MytGVG1tbFZxZXE0K1VFZE1Ob0FRWXNmMGtmdTlFdFNZRjhkQWxHUUx2RkhGSFZJWGtaMVhJKzB5YmtjRUxqaDNVT1ZyUnVYSGJjZ2JKYVE3UGp5Nk10YW1MYW9oSUNaNjhDaGYwUWE4UTdFbERHSk1SUUZRemNtMUNmNmZTRUJxOGJaZjl0RDdqZ1ZWZWZlcW83VCtIVUtUTm4rZFlyWElwT1IvY2lsWm50Rzd1bk5KWmFMak5iOTVCR2RZOXZObHNCcTFiOGFwcVdlaWdtbDhqdlh4NGpTWEw3WFlDeWo2YnRPa2h3LzdXZmlDOHNzUUJLcnB5eFJOZEF6d0FZRGI3Y21yeG5oT2lZZzdrL0hneGZ3cTBJWTAvYlhSVGtaTWRwZGNuVVg0U2NUdXhPRmF0ZFpYcG1ndmhpU0NxS1FCZzZvSk9GdFRPWmFlV0tiZjZMcFRuZUNyc3EvbG9JSHhic0lwc1NZYjJqUU5vRm5oSkNqYlFIY1UzZ1hwYWpEZzVaUzErMmFZL1hMR09Zc1BwQlpGYjVoc2Y0dFZJR2RhdHBwUXFSQTVjWjZ5blJLNTZJNUhhNllkYS9WSGVhRWl2SVh0eXV2c0VEN244UE9qcGpocXh3N2FUM0w2cTEyaUZ3M2pKdVdzUEZHOXdUczhzK3BBaVFEL3hlZ1QyWk5NeExURVBlU3laQys4TENiK3BPUVpCNVpWM042L1RpVldxN0JOTDg4Qi8yR1JkbmZ0MXd0cCtqVmNBbHlkeXdjM0JkdzQrdHpsNVhweUJvVCIsIm1hYyI6IjZkNDFhNjdhYmZlZjIyOTc1ZmVmY2Y3MTRlMzc0YjU2OGQ2NGMxNTJmMzdmMmMxZjgxZmQ4NzE1ZDBhMjk5NmQiLCJ0YWciOiIifQ== \ No newline at end of file From 25e75fbc524e01b01c869857d9001388da48bc2d Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 5 Mar 2024 16:30:54 +1100 Subject: [PATCH 07/21] Fixes for report exports --- app/Export/CSV/InvoiceExport.php | 6 +-- app/Export/CSV/InvoiceItemExport.php | 6 +-- app/Export/CSV/PurchaseOrderExport.php | 60 +++------------------- app/Export/CSV/PurchaseOrderItemExport.php | 38 +++++++++----- app/Export/Decorators/InvoiceDecorator.php | 1 - 5 files changed, 37 insertions(+), 74 deletions(-) diff --git a/app/Export/CSV/InvoiceExport.php b/app/Export/CSV/InvoiceExport.php index 9c81fadab634..e7b08a7ec3ac 100644 --- a/app/Export/CSV/InvoiceExport.php +++ b/app/Export/CSV/InvoiceExport.php @@ -151,9 +151,9 @@ class InvoiceExport extends BaseExport // $entity['invoice.status'] = $invoice->stringStatus($invoice->status_id); // } - // if (in_array('invoice.recurring_id', $this->input['report_keys'])) { - // $entity['invoice.recurring_id'] = $invoice->recurring_invoice->number ?? ''; - // } + if (in_array('invoice.recurring_id', $this->input['report_keys'])) { + $entity['invoice.recurring_id'] = $invoice->recurring_invoice->number ?? ''; + } if (in_array('invoice.auto_bill_enabled', $this->input['report_keys'])) { $entity['invoice.auto_bill_enabled'] = $invoice->auto_bill_enabled ? ctrans('texts.yes') : ctrans('texts.no'); diff --git a/app/Export/CSV/InvoiceItemExport.php b/app/Export/CSV/InvoiceItemExport.php index 54cfd22bc3ef..791bfeddad17 100644 --- a/app/Export/CSV/InvoiceItemExport.php +++ b/app/Export/CSV/InvoiceItemExport.php @@ -236,9 +236,9 @@ class InvoiceItemExport extends BaseExport // $entity['invoice.status'] = $invoice->stringStatus($invoice->status_id); // } - // if (in_array('invoice.recurring_id', $this->input['report_keys'])) { - // $entity['invoice.recurring_id'] = $invoice->recurring_invoice->number ?? ''; - // } + if (in_array('invoice.recurring_id', $this->input['report_keys'])) { + $entity['invoice.recurring_id'] = $invoice->recurring_invoice->number ?? ''; + } if (in_array('invoice.assigned_user_id', $this->input['report_keys'])) { $entity['invoice.assigned_user_id'] = $invoice->assigned_user ? $invoice->assigned_user->present()->name() : ''; diff --git a/app/Export/CSV/PurchaseOrderExport.php b/app/Export/CSV/PurchaseOrderExport.php index a43702b035fb..2a1a77956e44 100644 --- a/app/Export/CSV/PurchaseOrderExport.php +++ b/app/Export/CSV/PurchaseOrderExport.php @@ -31,51 +31,6 @@ class PurchaseOrderExport extends BaseExport private Decorator $decorator; - public array $entity_keys = [ - 'amount' => 'purchase_order.amount', - 'balance' => 'purchase_order.balance', - 'vendor' => 'purchase_order.vendor_id', - // 'custom_surcharge1' => 'purchase_order.custom_surcharge1', - // 'custom_surcharge2' => 'purchase_order.custom_surcharge2', - // 'custom_surcharge3' => 'purchase_order.custom_surcharge3', - // 'custom_surcharge4' => 'purchase_order.custom_surcharge4', - 'custom_value1' => 'purchase_order.custom_value1', - 'custom_value2' => 'purchase_order.custom_value2', - 'custom_value3' => 'purchase_order.custom_value3', - 'custom_value4' => 'purchase_order.custom_value4', - 'date' => 'purchase_order.date', - 'discount' => 'purchase_order.discount', - 'due_date' => 'purchase_order.due_date', - 'exchange_rate' => 'purchase_order.exchange_rate', - 'footer' => 'purchase_order.footer', - 'number' => 'purchase_order.number', - 'paid_to_date' => 'purchase_order.paid_to_date', - 'partial' => 'purchase_order.partial', - 'partial_due_date' => 'purchase_order.partial_due_date', - 'po_number' => 'purchase_order.po_number', - 'private_notes' => 'purchase_order.private_notes', - 'public_notes' => 'purchase_order.public_notes', - 'status' => 'purchase_order.status', - 'tax_name1' => 'purchase_order.tax_name1', - 'tax_name2' => 'purchase_order.tax_name2', - 'tax_name3' => 'purchase_order.tax_name3', - 'tax_rate1' => 'purchase_order.tax_rate1', - 'tax_rate2' => 'purchase_order.tax_rate2', - 'tax_rate3' => 'purchase_order.tax_rate3', - 'terms' => 'purchase_order.terms', - 'total_taxes' => 'purchase_order.total_taxes', - 'currency_id' => 'purchase_order.currency_id', - ]; - - private array $decorate_keys = [ - 'country', - 'currency_id', - 'status', - 'vendor', - 'project', - ]; - - public function __construct(Company $company, array $input) { $this->company = $company; @@ -169,7 +124,7 @@ class PurchaseOrderExport extends BaseExport if (is_array($parts) && $parts[0] == 'purchase_order' && array_key_exists($parts[1], $transformed_purchase_order)) { $entity[$key] = $transformed_purchase_order[$parts[1]]; } else { - // nlog($key); + nlog($key); $entity[$key] = $this->decorator->transform($key, $purchase_order); // $entity[$key] = ''; @@ -184,16 +139,13 @@ class PurchaseOrderExport extends BaseExport private function decorateAdvancedFields(PurchaseOrder $purchase_order, array $entity): array { - if (in_array('country_id', $this->input['report_keys'])) { - $entity['country'] = $purchase_order->vendor->country ? ctrans("texts.country_{$purchase_order->vendor->country->name}") : ''; + + if (in_array('purchase_order.currency_id', $this->input['report_keys'])) { + $entity['purchase_order.currency_id'] = $purchase_order->vendor->currency() ? $purchase_order->vendor->currency()->code : $purchase_order->company->currency()->code; } - if (in_array('currency_id', $this->input['report_keys'])) { - $entity['currency_id'] = $purchase_order->vendor->currency() ? $purchase_order->vendor->currency()->code : $purchase_order->company->currency()->code; - } - - if (in_array('vendor_id', $this->input['report_keys'])) { - $entity['vendor'] = $purchase_order->vendor->present()->name(); + if (in_array('purchase_order.vendor_id', $this->input['report_keys'])) { + $entity['purchase_order.vendor_id'] = $purchase_order->vendor->present()->name(); } if (in_array('purchase_order.status', $this->input['report_keys'])) { diff --git a/app/Export/CSV/PurchaseOrderItemExport.php b/app/Export/CSV/PurchaseOrderItemExport.php index a4f9cc5de795..358af941509f 100644 --- a/app/Export/CSV/PurchaseOrderItemExport.php +++ b/app/Export/CSV/PurchaseOrderItemExport.php @@ -192,23 +192,35 @@ class PurchaseOrderItemExport extends BaseExport private function decorateAdvancedFields(PurchaseOrder $purchase_order, array $entity): array { - if (in_array('currency_id', $this->input['report_keys'])) { - $entity['currency'] = $purchase_order->vendor->currency() ? $purchase_order->vendor->currency()->code : $purchase_order->company->currency()->code; + // if (in_array('currency_id', $this->input['report_keys'])) { + // $entity['currency'] = $purchase_order->vendor->currency() ? $purchase_order->vendor->currency()->code : $purchase_order->company->currency()->code; + // } + + // if(array_key_exists('type', $entity)) { + // $entity['type'] = $purchase_order->typeIdString($entity['type']); + // } + + // if(array_key_exists('tax_category', $entity)) { + // $entity['tax_category'] = $purchase_order->taxTypeString($entity['tax_category']); + // } + + // if($this->force_keys) { + // $entity['vendor'] = $purchase_order->vendor->present()->name(); + // $entity['vendor_id_number'] = $purchase_order->vendor->id_number; + // $entity['vendor_number'] = $purchase_order->vendor->number; + // $entity['status'] = $purchase_order->stringStatus($purchase_order->status_id); + // } + + if (in_array('purchase_order.currency_id', $this->input['report_keys'])) { + $entity['purchase_order.currency_id'] = $purchase_order->vendor->currency() ? $purchase_order->vendor->currency()->code : $purchase_order->company->currency()->code; } - if(array_key_exists('type', $entity)) { - $entity['type'] = $purchase_order->typeIdString($entity['type']); + if (in_array('purchase_order.vendor_id', $this->input['report_keys'])) { + $entity['purchase_order.vendor_id'] = $purchase_order->vendor->present()->name(); } - if(array_key_exists('tax_category', $entity)) { - $entity['tax_category'] = $purchase_order->taxTypeString($entity['tax_category']); - } - - if($this->force_keys) { - $entity['vendor'] = $purchase_order->vendor->present()->name(); - $entity['vendor_id_number'] = $purchase_order->vendor->id_number; - $entity['vendor_number'] = $purchase_order->vendor->number; - $entity['status'] = $purchase_order->stringStatus($purchase_order->status_id); + if (in_array('purchase_order.status', $this->input['report_keys'])) { + $entity['purchase_order.status'] = $purchase_order->stringStatus($purchase_order->status_id); } if (in_array('purchase_order.user_id', $this->input['report_keys'])) { diff --git a/app/Export/Decorators/InvoiceDecorator.php b/app/Export/Decorators/InvoiceDecorator.php index 8dd6d36e439d..5ce6d936c6ce 100644 --- a/app/Export/Decorators/InvoiceDecorator.php +++ b/app/Export/Decorators/InvoiceDecorator.php @@ -79,7 +79,6 @@ class InvoiceDecorator extends Decorator implements DecoratorInterface return $invoice->partial_due_date ?? ''; } - public function assigned_user_id(Invoice $invoice) { return $invoice->assigned_user ? $invoice->assigned_user->present()->name() : ''; From da518bad6e887bcf09ba2b58a5e86ba7cb131946 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 5 Mar 2024 16:31:20 +1100 Subject: [PATCH 08/21] v5.8.33 --- VERSION.txt | 2 +- config/ninja.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/VERSION.txt b/VERSION.txt index 577d1e25e9a9..723ac17de3a1 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -5.8.32 \ No newline at end of file +5.8.33 \ No newline at end of file diff --git a/config/ninja.php b/config/ninja.php index 660b465a201b..a6e920678030 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.8.32'), - 'app_tag' => env('APP_TAG', '5.8.32'), + 'app_version' => env('APP_VERSION', '5.8.33'), + 'app_tag' => env('APP_TAG', '5.8.33'), 'minimum_client_version' => '5.0.16', 'terms_version' => '1.0.1', 'api_secret' => env('API_SECRET', false), From 8b382199d4b5765cba709fdaf3c6b62a8a0acd37 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 5 Mar 2024 16:32:05 +1100 Subject: [PATCH 09/21] Add back throttle provider --- app/Providers/RouteServiceProvider.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 967858f658ef..75e6ac6a7241 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -36,11 +36,11 @@ class RouteServiceProvider extends ServiceProvider { parent::boot(); - // if (Ninja::isHosted() && !config('ninja.testvars.travis')) { - // app('router')->aliasMiddleware('throttle', ThrottleRequestsWithPredis::class); - // } else { + if (Ninja::isHosted() && !config('ninja.testvars.travis')) { + app('router')->aliasMiddleware('throttle', ThrottleRequestsWithPredis::class); + } else { app('router')->aliasMiddleware('throttle', ThrottleRequests::class); - // } + } Route::bind('task_scheduler', function ($value) { if (is_numeric($value)) { From aabcb41090dd5897464d2b3ecedae092120ae019 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 6 Mar 2024 06:30:06 +1100 Subject: [PATCH 10/21] Add cancelled invoice filter --- app/Filters/InvoiceFilters.php | 4 ++++ tests/Feature/ReminderTest.php | 38 ++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/app/Filters/InvoiceFilters.php b/app/Filters/InvoiceFilters.php index 568fb03c9a4b..06957ae8ce10 100644 --- a/app/Filters/InvoiceFilters.php +++ b/app/Filters/InvoiceFilters.php @@ -62,6 +62,10 @@ class InvoiceFilters extends QueryFilters $invoice_filters[] = Invoice::STATUS_PAID; } + if (in_array('cancelled', $status_parameters)) { + $invoice_filters[] = Invoice::STATUS_CANCELLED; + } + if (in_array('unpaid', $status_parameters)) { $invoice_filters[] = Invoice::STATUS_SENT; $invoice_filters[] = Invoice::STATUS_PARTIAL; diff --git a/tests/Feature/ReminderTest.php b/tests/Feature/ReminderTest.php index 23453dd2fb6e..c72067443277 100644 --- a/tests/Feature/ReminderTest.php +++ b/tests/Feature/ReminderTest.php @@ -157,6 +157,44 @@ class ReminderTest extends TestCase } + public function testForUtcEdgeCaseOnTheFirstOfMonth() + { + + $this->travelTo(Carbon::parse('2024-03-01')->startOfDay()); + + $this->invoice->status_id = 2; + $this->invoice->amount = 10; + $this->invoice->balance = 10; + $this->invoice->next_send_date = null; + $this->invoice->date = '2024-03-01'; + $this->invoice->last_sent_date = now(); + $this->invoice->due_date = Carbon::parse('2024-03-01')->addDays(30)->format('Y-m-d'); + $this->invoice->reminder_last_sent = null; + $this->invoice->save(); + + $settings = $this->company->settings; + $settings->enable_reminder1 = true; + $settings->schedule_reminder1 = 'before_due_date'; + $settings->num_days_reminder1 = 14; + $settings->enable_reminder2 = false; + $settings->schedule_reminder2 = ''; + $settings->num_days_reminder2 = 0; + $settings->enable_reminder3 = false; + $settings->schedule_reminder3 = ''; + $settings->num_days_reminder3 = 0; + $settings->timezone_id = '15'; + $settings->entity_send_time = 6; + $settings->endless_reminder_frequency_id = ''; + $settings->enable_reminder_endless = false; + + $this->invoice->service()->setReminder($settings)->save(); + + $this->invoice = $this->invoice->fresh(); + + $this->assertEquals('2024-03-17', \Carbon\Carbon::parse($this->invoice->next_send_date)->startOfDay()->format('Y-m-d')); + + } + public function testReminderInThePast() { From 69007836ac4eb17b2bda00d8055728a19cd7f7c0 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 7 Mar 2024 17:03:09 +1100 Subject: [PATCH 11/21] Minor fixes --- app/Exceptions/Handler.php | 2 -- app/Http/Requests/Invoice/StoreInvoiceRequest.php | 10 ++++++++++ app/Http/Requests/Invoice/UpdateInvoiceRequest.php | 7 +++++++ app/Http/Requests/Webhook/StoreWebhookRequest.php | 10 +++++----- app/Models/Webhook.php | 1 + 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 444733d814ee..514d8f28dde6 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -55,14 +55,12 @@ class Handler extends ExceptionHandler protected $selfHostDontReport = [ FilePermissionsFailure::class, - PDOException::class, MaxAttemptsExceededException::class, CommandNotFoundException::class, ValidationException::class, ModelNotFoundException::class, NotFoundHttpException::class, UnableToCreateDirectory::class, - ConnectException::class, RuntimeException::class, InvalidArgumentException::class, CredentialsException::class, diff --git a/app/Http/Requests/Invoice/StoreInvoiceRequest.php b/app/Http/Requests/Invoice/StoreInvoiceRequest.php index 018a1d7c7b36..800583d8dc37 100644 --- a/app/Http/Requests/Invoice/StoreInvoiceRequest.php +++ b/app/Http/Requests/Invoice/StoreInvoiceRequest.php @@ -77,6 +77,7 @@ class StoreInvoiceRequest extends Request $rules['exchange_rate'] = 'bail|sometimes|numeric'; $rules['partial'] = 'bail|sometimes|nullable|numeric|gte:0'; $rules['partial_due_date'] = ['bail', 'sometimes', 'exclude_if:partial,0', Rule::requiredIf(fn () => $this->partial > 0), 'date']; + $rules['due_date'] = ['bail', 'sometimes', 'nullable', 'after:partial_due_date', Rule::requiredIf(fn () => strlen($this->partial_due_date) > 1), 'date']; return $rules; @@ -112,6 +113,15 @@ class StoreInvoiceRequest extends Request $input['exchange_rate'] = 1; } + nlog($input['partial_due_date']); + nlog(strlen($input['partial_due_date'])); + + //handles edge case where we need for force set the due date of the invoice. + if((isset($input['partial_due_date']) && strlen($input['partial_due_date']) > 1) && (!array_key_exists('due_date', $input) || strlen($input['due_date']) == 0)) { + $client = \App\Models\Client::withTrashed()->find($input['client_id']); + $input['due_date'] = \Illuminate\Support\Carbon::parse($input['date'])->addDays($client->getSetting('payment_terms'))->format('Y-m-d'); + } + $this->replace($input); } } diff --git a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php index 501c2bab31d3..ce96da492d5d 100644 --- a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php +++ b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php @@ -78,6 +78,7 @@ class UpdateInvoiceRequest extends Request $rules['exchange_rate'] = 'bail|sometimes|numeric'; $rules['partial'] = 'bail|sometimes|nullable|numeric'; $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']; return $rules; @@ -107,6 +108,12 @@ class UpdateInvoiceRequest extends Request $input['exchange_rate'] = 1; } + //handles edge case where we need for force set the due date of the invoice. + if((isset($input['partial_due_date']) && strlen($input['partial_due_date']) > 1) && (!array_key_exists('due_date', $input) || strlen($input['due_date']) == 0 || empty($this->invoice->due_date))) { + $client = \App\Models\Client::withTrashed()->find($input['client_id']); + $input['due_date'] = \Illuminate\Support\Carbon::parse($input['date'])->addDays($client->getSetting('payment_terms'))->format('Y-m-d'); + } + $this->replace($input); } diff --git a/app/Http/Requests/Webhook/StoreWebhookRequest.php b/app/Http/Requests/Webhook/StoreWebhookRequest.php index c35b549d0e4a..fd917a1242ad 100644 --- a/app/Http/Requests/Webhook/StoreWebhookRequest.php +++ b/app/Http/Requests/Webhook/StoreWebhookRequest.php @@ -23,7 +23,10 @@ class StoreWebhookRequest extends Request */ public function authorize(): bool { - return auth()->user()->isAdmin() && auth()->user()->account->hasFeature(Account::FEATURE_API); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + return $user->isAdmin() && $user->account->hasFeature(Account::FEATURE_API); } public function rules() @@ -31,7 +34,6 @@ class StoreWebhookRequest extends Request return [ 'target_url' => 'bail|required|url', 'event_id' => 'bail|required', - // 'headers' => 'bail|sometimes|json', 'rest_method' => 'required|in:post,put' ]; } @@ -43,9 +45,7 @@ class StoreWebhookRequest extends Request if (!isset($input['rest_method'])) { $input['rest_method'] = 'post'; } - // if(isset($input['headers']) && count($input['headers']) == 0) - // $input['headers'] = null; - + $this->replace($input); } } diff --git a/app/Models/Webhook.php b/app/Models/Webhook.php index 3422e9315923..3661affb5f98 100644 --- a/app/Models/Webhook.php +++ b/app/Models/Webhook.php @@ -180,6 +180,7 @@ class Webhook extends BaseModel self::EVENT_DELETE_PURCHASE_ORDER, self::EVENT_RESTORE_PURCHASE_ORDER, self::EVENT_ARCHIVE_PURCHASE_ORDER, + self::EVENT_CREATE_PRODUCT, self::EVENT_UPDATE_PRODUCT, self::EVENT_DELETE_PRODUCT, self::EVENT_RESTORE_PRODUCT, From 708bad16ec4682345c4a2fa649c74b35859b2495 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 7 Mar 2024 17:33:22 +1100 Subject: [PATCH 12/21] Remove logging --- app/Http/Requests/Invoice/StoreInvoiceRequest.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/Http/Requests/Invoice/StoreInvoiceRequest.php b/app/Http/Requests/Invoice/StoreInvoiceRequest.php index 800583d8dc37..4381f4abcb3b 100644 --- a/app/Http/Requests/Invoice/StoreInvoiceRequest.php +++ b/app/Http/Requests/Invoice/StoreInvoiceRequest.php @@ -113,9 +113,6 @@ class StoreInvoiceRequest extends Request $input['exchange_rate'] = 1; } - nlog($input['partial_due_date']); - nlog(strlen($input['partial_due_date'])); - //handles edge case where we need for force set the due date of the invoice. if((isset($input['partial_due_date']) && strlen($input['partial_due_date']) > 1) && (!array_key_exists('due_date', $input) || strlen($input['due_date']) == 0)) { $client = \App\Models\Client::withTrashed()->find($input['client_id']); From 427360f414b63c002116412715a9e8b74f608354 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 7 Mar 2024 18:59:07 +1100 Subject: [PATCH 13/21] Fixes for tests --- tests/Feature/Export/ReportCsvGenerationTest.php | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/tests/Feature/Export/ReportCsvGenerationTest.php b/tests/Feature/Export/ReportCsvGenerationTest.php index 2db78dcd8f0e..cab75c368355 100644 --- a/tests/Feature/Export/ReportCsvGenerationTest.php +++ b/tests/Feature/Export/ReportCsvGenerationTest.php @@ -1592,14 +1592,13 @@ class ReportCsvGenerationTest extends TestCase $csv = $response->body(); - - $this->assertEquals('100', $this->getFirstValueByColumn($csv, 'Amount')); - $this->assertEquals('50', $this->getFirstValueByColumn($csv, 'Balance')); - $this->assertEquals('10', $this->getFirstValueByColumn($csv, 'Discount')); - $this->assertEquals('1234', $this->getFirstValueByColumn($csv, 'Number')); - $this->assertEquals('Public', $this->getFirstValueByColumn($csv, 'Public Notes')); - $this->assertEquals('Private', $this->getFirstValueByColumn($csv, 'Private Notes')); - $this->assertEquals('Terms', $this->getFirstValueByColumn($csv, 'Terms')); + $this->assertEquals('100', $this->getFirstValueByColumn($csv, 'Purchase Order Amount')); + $this->assertEquals('50', $this->getFirstValueByColumn($csv, 'Purchase Order Balance')); + $this->assertEquals('10', $this->getFirstValueByColumn($csv, 'Purchase Order Discount')); + $this->assertEquals('1234', $this->getFirstValueByColumn($csv, 'Purchase Order Number')); + $this->assertEquals('Public', $this->getFirstValueByColumn($csv, 'Purchase Order Public Notes')); + $this->assertEquals('Private', $this->getFirstValueByColumn($csv, 'Purchase Order Private Notes')); + $this->assertEquals('Terms', $this->getFirstValueByColumn($csv, 'Purchase Order Terms')); } From 5ad1b2f19f3bd0e1a279eab217f6e036d12a7f99 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 7 Mar 2024 21:48:19 +1100 Subject: [PATCH 14/21] Updates for openapi --- openapi/api-docs.yaml | 124 +++--------------- openapi/components/examples.yaml | 1 - openapi/components/schemas.yaml | 4 - .../components/schemas/bank_integration.yaml | 4 - .../components/schemas/bank_transaction.yaml | 4 - .../schemas/bank_transaction_rule.yaml | 4 - openapi/components/schemas/client.yaml | 5 - .../components/schemas/client_contact.yaml | 5 - .../schemas/client_gateway_token.yaml | 4 - .../components/schemas/company_gateway.yaml | 4 - openapi/components/schemas/credit.yaml | 4 - openapi/components/schemas/project.yaml | 1 - 12 files changed, 20 insertions(+), 144 deletions(-) diff --git a/openapi/api-docs.yaml b/openapi/api-docs.yaml index 3ebcf8377e78..c66157dd9b2c 100644 --- a/openapi/api-docs.yaml +++ b/openapi/api-docs.yaml @@ -14065,7 +14065,6 @@ components: # id: Opnel5aKBz # user_id: Ua6Rw4pVbS # assigned_user_id: Ua6Rw4pVbS - # company_id: Co7Vn3yLmW # name: "Jim's Housekeeping" # website: https://www.jims-housekeeping.com # private_notes: Client prefers email communication over phone calls @@ -14484,10 +14483,6 @@ components: description: 'The user hashed id' type: string example: Opnel5aKBz - company_id: - description: 'The company hashed id' - type: string - example: Opnel5aKBz name: description: 'The name of the group' type: string @@ -14765,10 +14760,6 @@ components: description: "The unique hashed ID of the assigned user responsible for the credit" type: string example: 6f7g8h9i0j - company_id: - description: "The unique hashed ID of the company associated with the credit" - type: string - example: k1l2m3n4o5 client_id: description: "The unique hashed ID of the client associated with the credit" type: string @@ -15196,11 +15187,6 @@ components: description: 'The assigned user hashed id' type: string example: Opnel5aKBz - company_id: - description: 'The company hashed id' - type: string - example: Opnel5aKBz - readOnly: true client_id: description: 'The client hashed id' type: string @@ -15769,11 +15755,7 @@ components: description: 'The assigned user hashed id' type: string example: Opnel5aKBz - company_id: - description: 'The company hashed id' - type: string - example: Opnel5aKBz - readOnly: true + client_id: description: 'The client hashed id' type: string @@ -15999,10 +15981,6 @@ components: description: 'The account hashed id' type: string example: AS3df3A - company_id: - description: 'The company hashed id' - type: string - example: AS3df3A user_id: description: 'The user_id hashed id' type: string @@ -16054,10 +16032,7 @@ components: description: 'The associated project_id' type: string example: 'Opnel5aKBz' - company_id: - description: 'The company hashed id' - type: string - example: 'Opnel5aKBz' + client_id: description: 'The client hashed id' type: string @@ -16205,10 +16180,7 @@ components: description: 'The bank integration hashed id' type: string example: AS3df3A - company_id: - description: 'The company hashed id' - type: string - example: AS3df3A + user_id: description: 'The user hashed id' type: string @@ -16287,10 +16259,7 @@ components: description: 'The bank integration hashed id' type: string example: AS3df3A - company_id: - description: 'The company hashed id' - type: string - example: AS3df3A + user_id: description: 'The user hashed id' type: string @@ -16342,10 +16311,7 @@ components: description: Unique identifier for the product associated with the subscription type: string example: Pr5Ft7yBmC - company_id: - description: Unique identifier for the company associated with the subscription - type: string - example: Co7Vn3yLmW + recurring_invoice_id: description: Unique identifier for the recurring invoice associated with the subscription type: string @@ -16577,10 +16543,7 @@ components: description: 'The assigned user hashed id' type: string example: Opnel5aKBz - company_id: - description: 'The company hashed id' - type: string - example: Opnel5aKBz + client_id: description: 'The client hashed id' type: string @@ -16942,7 +16905,6 @@ components: required: - id - user_id - - company_id - name - task_rate - budgeted_hours @@ -16969,11 +16931,7 @@ components: description: 'The unique identifier of the user who has been assigned the client' type: string example: Ua6Rw4pVbS - company_id: - description: 'The unique identifier of the company the client belongs to' - type: string - example: Co7Vn3yLmW - readOnly: true + name: description: 'The name of the client company or organization' type: string @@ -17161,10 +17119,7 @@ components: description: 'The hashed id of the assigned user to this vendor. This is a unique identifier for the user.' type: string example: Opnel5aKBz - company_id: - description: 'The hashed id of the company. This is a unique identifier for the company.' - type: string - example: Opnel5aKBz + contacts: type: array items: @@ -17307,11 +17262,7 @@ components: type: string example: Opnel5aKBz readOnly: true - company_id: - description: 'The hashed id of the company' - type: string - example: Opnel5aKBz - readOnly: true + vendor_id: description: 'The hashed id of the vendor' type: string @@ -17406,10 +17357,7 @@ components: description: 'The unique hashed identifier for the user assigned to the quote' type: string example: '' - company_id: - description: 'The unique hashed identifier for the company associated with the quote' - type: string - example: '' + client_id: description: 'The unique hashed identifier for the client associated with the quote' type: string @@ -17715,10 +17663,7 @@ components: description: 'The assigned user of the task' type: string example: Opnel5aKBz - company_id: - description: 'The hashed id of the company' - type: string - example: Opnel5aKBz + client_id: description: 'The hashed if of the client' type: string @@ -17829,10 +17774,7 @@ components: description: 'The assigned user hashed id' type: string example: Opnel5aKBz - company_id: - description: 'The company hashed id' - type: string - example: Opnel5aKBz + client_id: description: 'The client hashed id' type: string @@ -18172,10 +18114,7 @@ components: 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 @@ -18302,10 +18241,7 @@ components: description: 'The hashed id of the user assigned to this recurring expense' type: string example: Opnel5aKBz - company_id: - description: 'The hashed id of the company' - type: string - example: Opnel5aKBz + client_id: description: 'The hashed id of the client' type: string @@ -18491,10 +18427,7 @@ components: description: 'The hashed id of the client gateway token' type: string example: Opnel5aKBz - company_id: - description: 'The hashed id of the company' - type: string - example: '2' + client_id: description: 'The hashed_id of the client' type: string @@ -18626,10 +18559,7 @@ components: description: 'The hashed id of the company gateway' type: string example: Opnel5aKBz - company_id: - description: 'The company hashed id' - type: string - example: '2' + gateway_key: description: 'The gateway key (hash)' type: string @@ -18746,10 +18676,7 @@ components: description: 'The unique hashed identifier for the user assigned to the purchase order' type: string example: '' - company_id: - description: 'The unique hashed identifier for the company associated with the purchase order' - type: string - example: '' + vendor_id: description: 'The unique hashed identifier for the vendor associated with the purchase order' type: string @@ -19795,11 +19722,7 @@ components: description: 'The hashed product ID.' example: eP01N readOnly: true - company_id: - type: string - description: 'The hashed ID of the company that owns this product.' - example: eP01N - readOnly: true + user_id: type: string description: 'The hashed ID of the user that created this product.' @@ -21022,11 +20945,7 @@ components: type: string example: Opnel5aKBz readOnly: true - company_id: - description: 'The hashed id of the company' - type: string - example: Opnel5aKBz - readOnly: true + client_id: description: 'The hashed id of the client' type: string @@ -21216,10 +21135,7 @@ components: description: 'The bank transaction rules hashed id' type: string example: AS3df3A - company_id: - description: 'The company hashed id' - type: string - example: AS3df3A + user_id: description: 'The user hashed id' type: string diff --git a/openapi/components/examples.yaml b/openapi/components/examples.yaml index 23213ab4f502..c5459486e137 100644 --- a/openapi/components/examples.yaml +++ b/openapi/components/examples.yaml @@ -6,7 +6,6 @@ # id: Opnel5aKBz # user_id: Ua6Rw4pVbS # assigned_user_id: Ua6Rw4pVbS - # company_id: Co7Vn3yLmW # name: "Jim's Housekeeping" # website: https://www.jims-housekeeping.com # private_notes: Client prefers email communication over phone calls diff --git a/openapi/components/schemas.yaml b/openapi/components/schemas.yaml index f95b31df334f..3b524ba34535 100644 --- a/openapi/components/schemas.yaml +++ b/openapi/components/schemas.yaml @@ -45,10 +45,6 @@ description: 'The user hashed id' type: string example: Opnel5aKBz - company_id: - description: 'The company hashed id' - type: string - example: Opnel5aKBz name: description: 'The name of the group' type: string diff --git a/openapi/components/schemas/bank_integration.yaml b/openapi/components/schemas/bank_integration.yaml index a868c67ed2ff..4b2ff0d8b700 100644 --- a/openapi/components/schemas/bank_integration.yaml +++ b/openapi/components/schemas/bank_integration.yaml @@ -4,10 +4,6 @@ description: 'The bank integration hashed id' type: string example: AS3df3A - company_id: - description: 'The company hashed id' - type: string - example: AS3df3A user_id: description: 'The user hashed id' type: string diff --git a/openapi/components/schemas/bank_transaction.yaml b/openapi/components/schemas/bank_transaction.yaml index 940da2e3f8c4..083b987d48f2 100644 --- a/openapi/components/schemas/bank_transaction.yaml +++ b/openapi/components/schemas/bank_transaction.yaml @@ -4,10 +4,6 @@ description: 'The bank integration hashed id' type: string example: AS3df3A - company_id: - description: 'The company hashed id' - type: string - example: AS3df3A user_id: description: 'The user hashed id' type: string diff --git a/openapi/components/schemas/bank_transaction_rule.yaml b/openapi/components/schemas/bank_transaction_rule.yaml index 07c22d3d157c..fc05f2534bec 100644 --- a/openapi/components/schemas/bank_transaction_rule.yaml +++ b/openapi/components/schemas/bank_transaction_rule.yaml @@ -4,10 +4,6 @@ description: 'The bank transaction rules hashed id' type: string example: AS3df3A - company_id: - description: 'The company hashed id' - type: string - example: AS3df3A user_id: description: 'The user hashed id' type: string diff --git a/openapi/components/schemas/client.yaml b/openapi/components/schemas/client.yaml index d242122173b5..fb0949e16fe3 100644 --- a/openapi/components/schemas/client.yaml +++ b/openapi/components/schemas/client.yaml @@ -18,11 +18,6 @@ description: 'The unique identifier of the user who has been assigned the client' type: string example: Ua6Rw4pVbS - company_id: - description: 'The unique identifier of the company the client belongs to' - type: string - example: Co7Vn3yLmW - readOnly: true name: description: 'The name of the client company or organization' type: string diff --git a/openapi/components/schemas/client_contact.yaml b/openapi/components/schemas/client_contact.yaml index 4127b3448d7a..b248811c6adb 100644 --- a/openapi/components/schemas/client_contact.yaml +++ b/openapi/components/schemas/client_contact.yaml @@ -10,11 +10,6 @@ type: string example: Opnel5aKBz readOnly: true - company_id: - description: 'The hashed id of the company' - type: string - example: Opnel5aKBz - readOnly: true client_id: description: 'The hashed id of the client' type: string diff --git a/openapi/components/schemas/client_gateway_token.yaml b/openapi/components/schemas/client_gateway_token.yaml index b10587611278..408161453d42 100644 --- a/openapi/components/schemas/client_gateway_token.yaml +++ b/openapi/components/schemas/client_gateway_token.yaml @@ -4,10 +4,6 @@ description: 'The hashed id of the client gateway token' type: string example: Opnel5aKBz - company_id: - description: 'The hashed id of the company' - type: string - example: '2' client_id: description: 'The hashed_id of the client' type: string diff --git a/openapi/components/schemas/company_gateway.yaml b/openapi/components/schemas/company_gateway.yaml index 35196f5f1d25..1e90da31c70f 100644 --- a/openapi/components/schemas/company_gateway.yaml +++ b/openapi/components/schemas/company_gateway.yaml @@ -4,10 +4,6 @@ description: 'The hashed id of the company gateway' type: string example: Opnel5aKBz - company_id: - description: 'The company hashed id' - type: string - example: '2' gateway_key: description: 'The gateway key (hash)' type: string diff --git a/openapi/components/schemas/credit.yaml b/openapi/components/schemas/credit.yaml index bc06f457ea1d..7e88c70b0931 100644 --- a/openapi/components/schemas/credit.yaml +++ b/openapi/components/schemas/credit.yaml @@ -12,10 +12,6 @@ description: "The unique hashed ID of the assigned user responsible for the credit" type: string example: 6f7g8h9i0j - company_id: - description: "The unique hashed ID of the company associated with the credit" - type: string - example: k1l2m3n4o5 client_id: description: "The unique hashed ID of the client associated with the credit" type: string diff --git a/openapi/components/schemas/project.yaml b/openapi/components/schemas/project.yaml index 3588dbb4610e..66f383399c91 100644 --- a/openapi/components/schemas/project.yaml +++ b/openapi/components/schemas/project.yaml @@ -80,7 +80,6 @@ required: - id - user_id - - company_id - name - task_rate - budgeted_hours From b6d429e3362fa164a90f6d7bc15e1ced53d3a054 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 8 Mar 2024 06:56:44 +1100 Subject: [PATCH 15/21] Add tax calculations for quotes --- app/Transformers/CreditTransformer.php | 2 + app/Transformers/PurchaseOrderTransformer.php | 1 + app/Transformers/QuoteTransformer.php | 2 +- ...24_03_07_195116_add_tax_data_to_quotes.php | 36 + openapi/api-docs.yaml | 12976 ++++++++-------- openapi/components/schemas/expense.yaml | 4 - openapi/components/schemas/invoice.yaml | 5 - .../components/schemas/invoice_request.yaml | 5 - openapi/components/schemas/product.yaml | 5 - .../components/schemas/purchase_order.yaml | 4 - openapi/components/schemas/quote.yaml | 4 - .../components/schemas/recurring_expense.yaml | 4 - .../components/schemas/recurring_invoice.yaml | 4 - .../components/schemas/recurring_quote.yaml | 4 - openapi/components/schemas/subscription.yaml | 4 - openapi/components/schemas/system_log.yaml | 4 - openapi/components/schemas/task.yaml | 4 - openapi/components/schemas/vendor.yaml | 4 - .../components/schemas/vendor_contact.yaml | 5 - 19 files changed, 6517 insertions(+), 6560 deletions(-) create mode 100644 database/migrations/2024_03_07_195116_add_tax_data_to_quotes.php diff --git a/app/Transformers/CreditTransformer.php b/app/Transformers/CreditTransformer.php index ba6484e3d08e..e3833c5f56c4 100644 --- a/app/Transformers/CreditTransformer.php +++ b/app/Transformers/CreditTransformer.php @@ -132,6 +132,8 @@ class CreditTransformer extends EntityTransformer 'paid_to_date' => (float) $credit->paid_to_date, 'subscription_id' => $this->encodePrimaryKey($credit->subscription_id), 'invoice_id' => $credit->invoice_id ? $this->encodePrimaryKey($credit->invoice_id) : '', + 'tax_info' => $credit->tax_data ?: new \stdClass(), + ]; } } diff --git a/app/Transformers/PurchaseOrderTransformer.php b/app/Transformers/PurchaseOrderTransformer.php index d8015a7b26bd..25005e2853a5 100644 --- a/app/Transformers/PurchaseOrderTransformer.php +++ b/app/Transformers/PurchaseOrderTransformer.php @@ -149,6 +149,7 @@ class PurchaseOrderTransformer extends EntityTransformer 'subscription_id' => $this->encodePrimaryKey($purchase_order->subscription_id), 'expense_id' => $this->encodePrimaryKey($purchase_order->expense_id), 'currency_id' => $purchase_order->currency_id ? (string) $purchase_order->currency_id : '', + 'tax_info' => $purchase_order->tax_data ?: new \stdClass(), ]; } } diff --git a/app/Transformers/QuoteTransformer.php b/app/Transformers/QuoteTransformer.php index 649b9995e24c..8a12b2c46a0e 100644 --- a/app/Transformers/QuoteTransformer.php +++ b/app/Transformers/QuoteTransformer.php @@ -148,7 +148,7 @@ class QuoteTransformer extends EntityTransformer 'paid_to_date' => (float) $quote->paid_to_date, 'project_id' => $this->encodePrimaryKey($quote->project_id), 'subscription_id' => $this->encodePrimaryKey($quote->subscription_id), - + 'tax_info' => $quote->tax_data ?: new \stdClass(), ]; } } diff --git a/database/migrations/2024_03_07_195116_add_tax_data_to_quotes.php b/database/migrations/2024_03_07_195116_add_tax_data_to_quotes.php new file mode 100644 index 000000000000..8af39c02029f --- /dev/null +++ b/database/migrations/2024_03_07_195116_add_tax_data_to_quotes.php @@ -0,0 +1,36 @@ +mediumText('tax_data')->nullable(); //json object + }); + + Schema::table('credits', function (Blueprint $table) { + $table->mediumText('tax_data')->nullable(); //json object + }); + + Schema::table('purchase_orders', function (Blueprint $table) { + $table->mediumText('tax_data')->nullable(); //json object + }); + + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + + } +}; diff --git a/openapi/api-docs.yaml b/openapi/api-docs.yaml index c66157dd9b2c..3bf7f2fdf35a 100644 --- a/openapi/api-docs.yaml +++ b/openapi/api-docs.yaml @@ -8302,409 +8302,6 @@ 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/products: get: tags: @@ -9148,59 +8745,21 @@ paths: default: $ref: '#/components/responses/default' - /api/v1/recurring_invoices: + /api/v1/tasks: 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 + - 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/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 + - $ref: "#/components/parameters/index" responses: 200: - description: "A list of recurring_invoices" + description: "A list of tasks" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -9216,7 +8775,7 @@ paths: data: type: array items: - $ref: '#/components/schemas/RecurringInvoice' + $ref: '#/components/schemas/Task' meta: type: object $ref: '#/components/schemas/Meta' @@ -9234,17 +8793,17 @@ paths: $ref: "#/components/responses/default" post: tags: - - Recurring Invoices - summary: "Create recurring invoice" - description: "Adds a Recurring Invoice to the system" - operationId: storeRecurringInvoice + - 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 RecurringInvoice object" + description: "Returns the saved task object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -9255,7 +8814,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RecurringInvoice" + $ref: "#/components/schemas/Task" 401: $ref: "#/components/responses/401" 403: @@ -9268,21 +8827,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - - "/api/v1/recurring_invoices/{id}": + "/api/v1/tasks/{id}": get: tags: - - Recurring Invoices - summary: "Show recurring invoice" - description: "Displays an RecurringInvoice by id" - operationId: showRecurringInvoice + - 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 RecurringInvoice Hashed ID" + description: "The Task Hashed ID" required: true schema: type: string @@ -9290,7 +8848,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the RecurringInvoice object" + description: "Returns the task object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -9301,7 +8859,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RecurringInvoice" + $ref: "#/components/schemas/Task" 401: $ref: "#/components/responses/401" 403: @@ -9316,17 +8874,17 @@ paths: $ref: "#/components/responses/default" put: tags: - - Recurring Invoices - summary: "Update recurring invoice" - description: "Handles the updating of an RecurringInvoice by id" - operationId: updateRecurringInvoice + - 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 RecurringInvoice Hashed ID" + description: "The task Hashed ID" required: true schema: type: string @@ -9334,7 +8892,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the RecurringInvoice object" + description: "Returns the task object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -9345,7 +8903,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RecurringInvoice" + $ref: "#/components/schemas/Task" 401: $ref: "#/components/responses/401" 403: @@ -9360,17 +8918,17 @@ paths: $ref: "#/components/responses/default" delete: tags: - - Recurring Invoices - summary: "Delete recurring invoice" - description: "Handles the deletion of an RecurringInvoice by id" - operationId: deleteRecurringInvoice + - 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 RecurringInvoice Hashed ID" + description: "The Task Hashed ID" required: true schema: type: string @@ -9398,20 +8956,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/recurring_invoices/{id}/edit": + "/api/v1/tasks/{id}/edit": get: tags: - - Recurring Invoices - summary: "Edit recurring invoice" - description: "Displays an RecurringInvoice by id" - operationId: editRecurringInvoice + - 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 RecurringInvoice Hashed ID" + description: "The Task Hashed ID" required: true schema: type: string @@ -9419,7 +8977,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the RecurringInvoice object" + description: "Returns the client object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -9430,7 +8988,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RecurringInvoice" + $ref: "#/components/schemas/Task" 401: $ref: "#/components/responses/401" 403: @@ -9443,21 +9001,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - - /api/v1/recurring_invoices/create: + /api/v1/tasks/create: get: tags: - - Recurring Invoices - summary: "Blank recurring invoice" - description: "Returns a blank object with default values" - operationId: getRecurringInvoicesCreate + - 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 RecurringInvoice object" + description: "A blank task object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -9468,7 +9025,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RecurringInvoice" + $ref: "#/components/schemas/Task" 401: $ref: "#/components/responses/401" 403: @@ -9481,55 +9038,31 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/recurring_invoices/bulk: + /api/v1/tasks/bulk: post: tags: - - Recurring Invoices - summary: "Bulk recurring invoice actions" - description: | - There are multiple actions that are available including: - - operationId: bulkRecurringInvoices + - 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: "Bulk action details" + description: "User credentials" 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']" + type: array + items: + description: "Array of hashed IDs to be bulk 'actioned" + type: integer + example: "[0,1,2,3]" responses: 200: - description: "The RecurringInvoice response" + description: "The Task User response" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -9540,7 +9073,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RecurringInvoice" + $ref: "#/components/schemas/Task" 401: $ref: "#/components/responses/401" 403: @@ -9553,115 +9086,20 @@ paths: 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": + "/api/v1/tasks/{id}/upload": post: tags: - - Recurring Invoices - summary: "Add recurring invoice document" - description: "Handles the uploading of a document to a recurring_invoice" - operationId: uploadRecurringInvoice + - 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 RecurringInvoice Hashed ID" + description: "The Task Hashed ID" required: true schema: type: string @@ -9686,7 +9124,7 @@ paths: format: binary responses: 200: - description: "Returns the RecurringInvoice object" + description: "Returns the Task object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -9697,7 +9135,443 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RecurringInvoice" + $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: @@ -10901,21 +10775,56 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/projects: + /api/v1/payments: get: tags: - - projects - summary: "List projects" - description: "Lists projects" - operationId: getProjects + - 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/index" + - $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 projects" + description: "A list of payments" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -10931,7 +10840,7 @@ paths: data: type: array items: - $ref: '#/components/schemas/Project' + $ref: '#/components/schemas/Payment' meta: type: object $ref: '#/components/schemas/Meta' @@ -10949,17 +10858,24 @@ paths: $ref: "#/components/responses/default" post: tags: - - projects - summary: "Create project" - description: "Adds an project to a company" - operationId: storeProject + - 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 project object" + description: "Returns the saved Payment object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -10970,7 +10886,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Project" + $ref: "#/components/schemas/Payment" 401: $ref: "#/components/responses/401" 403: @@ -10983,20 +10899,21 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/projects/{id}": + + "/api/v1/payments/{id}": get: tags: - - projects - summary: "Show project" - description: "Displays a project by id" - operationId: showProject + - 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 Project Hashed ID" + description: "The Payment Hashed ID" required: true schema: type: string @@ -11004,7 +10921,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the expense object" + description: "Returns the Payment object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -11015,7 +10932,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Project" + $ref: "#/components/schemas/Payment" 401: $ref: "#/components/responses/401" 403: @@ -11030,17 +10947,17 @@ paths: $ref: "#/components/responses/default" put: tags: - - projects - summary: "Update project" - description: "Handles the updating of a project by id" - operationId: updateProject + - 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 Project Hashed ID" + description: "The Payment Hashed ID" required: true schema: type: string @@ -11048,7 +10965,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the project object" + description: "Returns the Payment object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -11059,7 +10976,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Project" + $ref: "#/components/schemas/Payment" 401: $ref: "#/components/responses/401" 403: @@ -11074,17 +10991,17 @@ paths: $ref: "#/components/responses/default" delete: tags: - - projects - summary: "Delete project" - description: "Handles the deletion of a project by id" - operationId: deleteProject + - 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 Project Hashed ID" + description: "The Payment Hashed ID" required: true schema: type: string @@ -11112,20 +11029,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/projects/{id}/edit": + "/api/v1/payments/{id}/edit": get: tags: - - projects - summary: "Edit project" - description: "Displays a project by id" - operationId: editProject + - 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 Project Hashed ID" + description: "The Payment Hashed ID" required: true schema: type: string @@ -11133,7 +11050,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the project object" + description: "Returns the Payment object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -11144,7 +11061,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Project" + $ref: "#/components/schemas/Payment" 401: $ref: "#/components/responses/401" 403: @@ -11157,20 +11074,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/projects/create: + /api/v1/payments/create: get: tags: - - projects - summary: "Blank project" + - payments + summary: "Blank payment" description: "Returns a blank object with default values" - operationId: getProjectsCreate + operationId: getPaymentsCreate parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" responses: 200: - description: "A blank project object" + description: "A blank Payment object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -11181,7 +11098,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Project" + $ref: "#/components/schemas/Payment" 401: $ref: "#/components/responses/401" 403: @@ -11194,13 +11111,57 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/projects/bulk: + /api/v1/payments/refund: post: tags: - - projects - summary: "Bulk project actions" + - 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: bulkProjects + operationId: bulkPayments parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" @@ -11218,7 +11179,7 @@ paths: example: "[0,1,2,3]" responses: 200: - description: "The Project User response" + description: "The Payment response" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -11229,7 +11190,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Project" + $ref: "#/components/schemas/Payment" 401: $ref: "#/components/responses/401" 403: @@ -11242,472 +11203,21 @@ paths: 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/quotes: - get: - tags: - - quotes - summary: "List quotes" - description: "Lists quotes, 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 quotes, these are handled by the QuoteFilters class which defines the methods available" - operationId: getQuotes - 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: - - number - - 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 quote status strings. Valid options include: - - all - - draft - - sent - - approved - - expired - - upcoming - required: false - schema: - type: string - example: ?client_status=paid,unpaid - - name: number - in: query - description: | - Search quote by quote number - required: false - schema: - type: string - example: ?number=Q-001 - - 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 quotes" - 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/Quote' - 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: - - quotes - summary: "Create quote" - description: "Adds an Quote to the system" - operationId: storeQuote - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - responses: - 200: - description: "Returns the saved Quote 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/Quote" - 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/{id}": - get: - tags: - - quotes - summary: "Show quote" - description: "Displays an Quote by id" - operationId: showQuote - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - name: id - in: path - description: "The Quote Hashed ID" - required: true - schema: - type: string - format: string - example: D2J234DFA - responses: - 200: - description: "Returns the Quote 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/Quote" - 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: - - quotes - summary: "Update quote" - description: "Handles the updating of an Quote by id" - operationId: updateQuote - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - name: id - in: path - description: "The Quote Hashed ID" - required: true - schema: - type: string - format: string - example: D2J234DFA - responses: - 200: - description: "Returns the Quote 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/Quote" - 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: - - quotes - summary: "Delete quote" - description: "Handles the deletion of an Quote by id" - operationId: deleteQuote - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - name: id - in: path - description: "The Quote 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/quotes/{id}/edit": - get: - tags: - - quotes - summary: "Edit quote" - description: "Displays an Quote by id" - operationId: editQuote - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - name: id - in: path - description: "The Quote Hashed ID" - required: true - schema: - type: string - format: string - example: D2J234DFA - responses: - 200: - description: "Returns the Quote 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/Quote" - 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/create: - get: - tags: - - quotes - summary: "Blank quote" - description: "Returns a blank object with default values" - operationId: getQuotesCreate - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - responses: - 200: - description: "A blank Quote 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/Quote" - 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/bulk: - post: - tags: - - quotes - summary: "Bulk quote actions" - description: "" - operationId: bulkQuotes - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/index" - requestBody: - description: "Hashed ids" - 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 Quote 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/Quote" - 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/{id}/{action}": + "/api/v1/payments/{id}/{action}": get: deprecated: true tags: - - quotes - summary: "Performs a custom action on an Quote" - description: "Performs a custom action on an Quote.\n\n The current range of actions are as follows\n - clone_to_quote\n - history\n - delivery_note\n - mark_paid\n - download\n - archive\n - delete\n - convert\n - convert_to_invoice\n - email" - operationId: actionQuote + - 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 Quote Hashed ID" + description: "The Payment Hashed ID" required: true schema: type: string @@ -11723,7 +11233,7 @@ paths: example: clone_to_quote responses: 200: - description: "Returns the Quote object" + description: "Returns the Payment object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -11734,7 +11244,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Quote" + $ref: "#/components/schemas/Payment" 401: $ref: "#/components/responses/401" 403: @@ -11747,61 +11257,21 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/quote/{invitation_key}/download": - get: - tags: - - quotes - summary: "Download quote PDF" - description: "Downloads a specific quote" - operationId: downloadQuote - parameters: - - $ref: "#/components/parameters/X-API-TOKEN" - - $ref: "#/components/parameters/X-Requested-With" - - $ref: "#/components/parameters/include" - - name: invitation_key - in: path - description: "The Quote Invitation Key" - required: true - schema: - type: string - format: string - example: D2J234DFA - responses: - 200: - description: "Returns the quote 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/quotes/{id}/upload": + + "/api/v1/payments/{id}/upload": post: tags: - - quotes - summary: "Upload a quote document" - description: "Handles the uploading of a document to a quote" - operationId: uploadQuote + - 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 Quote Hashed ID" + description: "The Payment Hashed ID" required: true schema: type: string @@ -11826,7 +11296,7 @@ paths: format: binary responses: 200: - description: "Returns the Quote object" + description: "Returns the Payment object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -11837,7 +11307,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Quote" + $ref: "#/components/schemas/Payment" 401: $ref: "#/components/responses/401" 403: @@ -12561,18 +12031,19 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/payments: + /api/v1/recurring_invoices: 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 + - 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/status" - $ref: "#/components/parameters/client_id" - $ref: "#/components/parameters/created_at" - $ref: "#/components/parameters/updated_at" @@ -12583,8 +12054,6 @@ paths: in: query description: | Searches across a range of columns including: - - amount - - date - custom_value1 - custom_value2 - custom_value3 @@ -12592,15 +12061,19 @@ paths: required: false schema: type: string - example: ?filter=10 - - name: number + example: ?filter=bob + - name: client_status in: query description: | - Search payments by payment number + A comma separated list of invoice status strings. Valid options include: + - all + - active + - paused + - completed required: false schema: type: string - example: ?number=0001 + example: ?client_status=active,paused - name: sort in: query description: Returns the list sorted by column in ascending or descending order. @@ -12610,7 +12083,7 @@ paths: example: id|desc number|desc balance|asc responses: 200: - description: "A list of payments" + description: "A list of recurring_invoices" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -12626,7 +12099,7 @@ paths: data: type: array items: - $ref: '#/components/schemas/Payment' + $ref: '#/components/schemas/RecurringInvoice' meta: type: object $ref: '#/components/schemas/Meta' @@ -12644,24 +12117,17 @@ paths: $ref: "#/components/responses/default" post: tags: - - payments - summary: "Create payment" - description: "Adds an Payment to the system" - operationId: storePayment + - 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" - requestBody: - description: "The payment request" - required: true - content: - application/json: - schema: - $ref: "#/components/schemas/Payment" responses: 200: - description: "Returns the saved Payment object" + description: "Returns the saved RecurringInvoice object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -12672,7 +12138,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Payment" + $ref: "#/components/schemas/RecurringInvoice" 401: $ref: "#/components/responses/401" 403: @@ -12686,20 +12152,20 @@ paths: default: $ref: "#/components/responses/default" - "/api/v1/payments/{id}": + "/api/v1/recurring_invoices/{id}": get: tags: - - payments - summary: "Show payment" - description: "Displays an Payment by id" - operationId: showPayment + - 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 Payment Hashed ID" + description: "The RecurringInvoice Hashed ID" required: true schema: type: string @@ -12707,7 +12173,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the Payment object" + description: "Returns the RecurringInvoice object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -12718,7 +12184,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Payment" + $ref: "#/components/schemas/RecurringInvoice" 401: $ref: "#/components/responses/401" 403: @@ -12733,17 +12199,17 @@ paths: $ref: "#/components/responses/default" put: tags: - - payments - summary: "Update payment" - description: "Handles the updating of an Payment by id" - operationId: updatePayment + - 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 Payment Hashed ID" + description: "The RecurringInvoice Hashed ID" required: true schema: type: string @@ -12751,7 +12217,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the Payment object" + description: "Returns the RecurringInvoice object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -12762,7 +12228,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Payment" + $ref: "#/components/schemas/RecurringInvoice" 401: $ref: "#/components/responses/401" 403: @@ -12777,17 +12243,17 @@ paths: $ref: "#/components/responses/default" delete: tags: - - payments - summary: "Delete payment" - description: "Handles the deletion of an Payment by id" - operationId: deletePayment + - 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 Payment Hashed ID" + description: "The RecurringInvoice Hashed ID" required: true schema: type: string @@ -12815,20 +12281,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/payments/{id}/edit": + "/api/v1/recurring_invoices/{id}/edit": get: tags: - - payments - summary: "Edit payment" - description: "Displays an Payment by id" - operationId: editPayment + - 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 Payment Hashed ID" + description: "The RecurringInvoice Hashed ID" required: true schema: type: string @@ -12836,7 +12302,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the Payment object" + description: "Returns the RecurringInvoice object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -12847,7 +12313,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Payment" + $ref: "#/components/schemas/RecurringInvoice" 401: $ref: "#/components/responses/401" 403: @@ -12860,20 +12326,21 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/payments/create: + + /api/v1/recurring_invoices/create: get: tags: - - payments - summary: "Blank payment" + - Recurring Invoices + summary: "Blank recurring invoice" description: "Returns a blank object with default values" - operationId: getPaymentsCreate + operationId: getRecurringInvoicesCreate parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" - $ref: "#/components/parameters/include" responses: 200: - description: "A blank Payment object" + description: "A blank RecurringInvoice object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -12884,7 +12351,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Payment" + $ref: "#/components/schemas/RecurringInvoice" 401: $ref: "#/components/responses/401" 403: @@ -12897,75 +12364,55 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/payments/refund: + /api/v1/recurring_invoices/bulk: 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 + - 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: "User credentials" + description: "Bulk action details" 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]" + 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 Payment response" + description: "The RecurringInvoice response" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -12976,7 +12423,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Payment" + $ref: "#/components/schemas/RecurringInvoice" 401: $ref: "#/components/responses/401" 403: @@ -12989,21 +12436,21 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/payments/{id}/{action}": + "/api/v1/recurring_invoices/{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 + - 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 Payment Hashed ID" + description: "The RecurringInvoice Hashed ID" required: true schema: type: string @@ -13019,7 +12466,7 @@ paths: example: clone_to_quote responses: 200: - description: "Returns the Payment object" + description: "Returns the RecurringInvoice object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -13030,7 +12477,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Payment" + $ref: "#/components/schemas/RecurringInvoice" 401: $ref: "#/components/responses/401" 403: @@ -13043,21 +12490,61 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - - "/api/v1/payments/{id}/upload": + "/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: - - payments - summary: "Upload a payment document" - description: "Handles the uploading of a document to a payment" - operationId: uploadPayment + - 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 Payment Hashed ID" + description: "The RecurringInvoice Hashed ID" required: true schema: type: string @@ -13082,7 +12569,7 @@ paths: format: binary responses: 200: - description: "Returns the Payment object" + description: "Returns the RecurringInvoice object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -13093,7 +12580,553 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Payment" + $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: + - quotes + summary: "List quotes" + description: "Lists quotes, 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 quotes, these are handled by the QuoteFilters class which defines the methods available" + operationId: getQuotes + 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: + - number + - 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 quote status strings. Valid options include: + - all + - draft + - sent + - approved + - expired + - upcoming + required: false + schema: + type: string + example: ?client_status=paid,unpaid + - name: number + in: query + description: | + Search quote by quote number + required: false + schema: + type: string + example: ?number=Q-001 + - 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 quotes" + 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/Quote' + 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: + - quotes + summary: "Create quote" + description: "Adds an Quote to the system" + operationId: storeQuote + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + responses: + 200: + description: "Returns the saved Quote 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/Quote" + 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/{id}": + get: + tags: + - quotes + summary: "Show quote" + description: "Displays an Quote by id" + operationId: showQuote + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: id + in: path + description: "The Quote Hashed ID" + required: true + schema: + type: string + format: string + example: D2J234DFA + responses: + 200: + description: "Returns the Quote 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/Quote" + 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: + - quotes + summary: "Update quote" + description: "Handles the updating of an Quote by id" + operationId: updateQuote + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: id + in: path + description: "The Quote Hashed ID" + required: true + schema: + type: string + format: string + example: D2J234DFA + responses: + 200: + description: "Returns the Quote 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/Quote" + 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: + - quotes + summary: "Delete quote" + description: "Handles the deletion of an Quote by id" + operationId: deleteQuote + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: id + in: path + description: "The Quote 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/quotes/{id}/edit": + get: + tags: + - quotes + summary: "Edit quote" + description: "Displays an Quote by id" + operationId: editQuote + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: id + in: path + description: "The Quote Hashed ID" + required: true + schema: + type: string + format: string + example: D2J234DFA + responses: + 200: + description: "Returns the Quote 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/Quote" + 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/create: + get: + tags: + - quotes + summary: "Blank quote" + description: "Returns a blank object with default values" + operationId: getQuotesCreate + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + responses: + 200: + description: "A blank Quote 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/Quote" + 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/bulk: + post: + tags: + - quotes + summary: "Bulk quote actions" + description: "" + operationId: bulkQuotes + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/index" + requestBody: + description: "Hashed ids" + 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 Quote 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/Quote" + 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/{id}/{action}": + get: + deprecated: true + tags: + - quotes + summary: "Performs a custom action on an Quote" + description: "Performs a custom action on an Quote.\n\n The current range of actions are as follows\n - clone_to_quote\n - history\n - delivery_note\n - mark_paid\n - download\n - archive\n - delete\n - convert\n - convert_to_invoice\n - email" + operationId: actionQuote + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: id + in: path + description: "The Quote 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 Quote 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/Quote" + 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/quote/{invitation_key}/download": + get: + tags: + - quotes + summary: "Download quote PDF" + description: "Downloads a specific quote" + operationId: downloadQuote + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: invitation_key + in: path + description: "The Quote Invitation Key" + required: true + schema: + type: string + format: string + example: D2J234DFA + responses: + 200: + description: "Returns the quote 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/quotes/{id}/upload": + post: + tags: + - quotes + summary: "Upload a quote document" + description: "Handles the uploading of a document to a quote" + operationId: uploadQuote + parameters: + - $ref: "#/components/parameters/X-API-TOKEN" + - $ref: "#/components/parameters/X-Requested-With" + - $ref: "#/components/parameters/include" + - name: id + in: path + description: "The Quote 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 Quote 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/Quote" 401: $ref: "#/components/responses/401" 403: @@ -13602,13 +13635,13 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/tasks: + /api/v1/vendors: 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 + - 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" @@ -13616,7 +13649,7 @@ paths: - $ref: "#/components/parameters/index" responses: 200: - description: "A list of tasks" + description: "A list of vendors" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -13632,7 +13665,7 @@ paths: data: type: array items: - $ref: '#/components/schemas/Task' + $ref: '#/components/schemas/Vendor' meta: type: object $ref: '#/components/schemas/Meta' @@ -13650,17 +13683,17 @@ paths: $ref: "#/components/responses/default" post: tags: - - tasks - summary: "Create task" - description: "Adds an task to a company" - operationId: storeTask + - 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 task object" + description: "Returns the saved clivendorent object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -13671,7 +13704,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Task" + $ref: "#/components/schemas/Vendor" 401: $ref: "#/components/responses/401" 403: @@ -13684,20 +13717,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/tasks/{id}": + "/api/v1/vendors/{id}": get: tags: - - tasks - summary: "Show task" - description: "Displays a task by id" - operationId: showTask + - 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 Task Hashed ID" + description: "The vendor Hashed ID" required: true schema: type: string @@ -13705,7 +13738,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the task object" + description: "Returns the vendor object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -13716,7 +13749,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Task" + $ref: "#/components/schemas/Vendor" 401: $ref: "#/components/responses/401" 403: @@ -13731,17 +13764,17 @@ paths: $ref: "#/components/responses/default" put: tags: - - tasks - summary: "Update task" - description: "Handles the updating of a task by id" - operationId: updateTask + - 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 task Hashed ID" + description: "The Vendor Hashed ID" required: true schema: type: string @@ -13749,7 +13782,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the task object" + description: "Returns the vendor object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -13760,7 +13793,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Task" + $ref: "#/components/schemas/Vendor" 401: $ref: "#/components/responses/401" 403: @@ -13775,17 +13808,17 @@ paths: $ref: "#/components/responses/default" delete: tags: - - tasks - summary: "Delete task" - description: "Handles the deletion of a task by id" - operationId: deleteTask + - 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 Task Hashed ID" + description: "The Vendor Hashed ID" required: true schema: type: string @@ -13813,20 +13846,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/tasks/{id}/edit": + "/api/v1/vendors/{id}/edit": get: tags: - - tasks - summary: "Edit task" - description: "Displays a task by id" - operationId: editTask + - 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 Task Hashed ID" + description: "The Vendor Hashed ID" required: true schema: type: string @@ -13834,7 +13867,7 @@ paths: example: D2J234DFA responses: 200: - description: "Returns the client object" + description: "Returns the vendor object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -13845,7 +13878,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Task" + $ref: "#/components/schemas/Vendor" 401: $ref: "#/components/responses/401" 403: @@ -13858,20 +13891,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/tasks/create: + /api/v1/vendors/create: get: tags: - - tasks - summary: "Blank task" - description: "Returns a blank task with default values" - operationId: getTasksCreate + - 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 task object" + description: "A blank vendor object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -13882,7 +13915,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Task" + $ref: "#/components/schemas/Vendor" 401: $ref: "#/components/responses/401" 403: @@ -13895,13 +13928,13 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - /api/v1/tasks/bulk: + /api/v1/vendors/bulk: post: tags: - - tasks - summary: "Bulk task actions" + - vendors + summary: "Bulk vendor actions" description: "" - operationId: bulkTasks + operationId: bulkVendors parameters: - $ref: "#/components/parameters/X-API-TOKEN" - $ref: "#/components/parameters/X-Requested-With" @@ -13919,7 +13952,7 @@ paths: example: "[0,1,2,3]" responses: 200: - description: "The Task User response" + description: "The Vendor User response" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -13930,7 +13963,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Task" + $ref: "#/components/schemas/Vendor" 401: $ref: "#/components/responses/401" 403: @@ -13943,20 +13976,20 @@ paths: description: 'Server error' default: $ref: "#/components/responses/default" - "/api/v1/tasks/{id}/upload": + "/api/v1/vendors/{id}/upload": post: tags: - - tasks - summary: "Uploads a task document" - description: "Handles the uploading of a document to a task" - operationId: uploadTask + - 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 Task Hashed ID" + description: "The Vendor Hashed ID" required: true schema: type: string @@ -13981,7 +14014,7 @@ paths: format: binary responses: 200: - description: "Returns the Task object" + description: "Returns the Vendor object" headers: X-MINIMUM-CLIENT-VERSION: $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION" @@ -13992,40 +14025,7 @@ paths: 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" + $ref: "#/components/schemas/Vendor" 401: $ref: "#/components/responses/401" 403: @@ -14132,49 +14132,43 @@ components: # - prev: null # - next: null responses: - 500: - description: 'Gateway Error' - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - 403: - description: 'Authorization error' - content: - application/json: - schema: - $ref: '#/components/schemas/AuthorizationError' - - default: - description: 'Unexpected Error' - content: - application/json: - schema: - $ref: '#/components/schemas/Error' 429: description: 'Rate Limit Exceeded' content: application/json: schema: $ref: '#/components/schemas/RateLimiterError' + + 403: + description: 'Authorization error' + content: + application/json: + schema: + $ref: '#/components/schemas/AuthorizationError' 422: description: 'Validation error' content: application/json: schema: $ref: '#/components/schemas/ValidationError' - 401: - description: 'Authentication error' + default: + description: 'Unexpected Error' content: application/json: schema: - $ref: '#/components/schemas/AuthenticationError' + $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 @@ -14746,239 +14740,189 @@ components: type: string example: JSON type: object - Credit: + Product: + type: object properties: id: - description: "The unique hashed ID of the credit" + 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' + + 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 unique hashed ID of the user associated with the credit" + description: 'The user hashed id' 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 + example: XS987sD 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" + description: 'Flag determining whether the expense category has been deleted' 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 - - 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 + 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 @@ -15140,1394 +15084,224 @@ components: ``` example: '1' - CompanyLedger: + CompanyToken: properties: - entity_id: - description: 'This field will reference one of the following entity hashed ID payment_id, invoice_id or credit_id' + 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 - notes: - description: 'The notes which reference this entry of the ledger' + user_id: + description: 'The user hashed id' 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' + 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: '1434342123' + example: '134341234234' + updated_at: + description: Timestamp + type: number + format: integer + example: '134341234234' + deleted_at: + description: Timestamp + type: number + format: integer + example: '134341234234' type: object - Invoice: + Payment: properties: id: - description: 'The invoice hashed id' - type: string - example: Opnel5aKBz - readOnly: true - user_id: - description: 'The user hashed id' - type: string - example: Opnel5aKBz - readOnly: true - assigned_user_id: - description: 'The assigned user hashed id' + description: 'The payment 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' - 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' - 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/InvoiceInvitation' - 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' - 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 - project_id: - description: 'The project associated with this invoice' + invitation_id: + description: 'The invitation hashed id' type: string example: Opnel5aKBz - auto_bill_tries: - description: 'The number of times the invoice has attempted to be auto billed' - type: integer - example: '1' - readOnly: true - auto_bill_enabled: - description: 'Boolean flag determining if the invoice is set to auto bill' - type: boolean - example: true - subscription_id: - description: 'The subscription associated with this invoice' + client_contact_id: + description: 'The client contact hashed id' type: string example: Opnel5aKBz - - 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 - 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 - 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 + description: 'The Payment Type ID' type: string - example: '2' - created_at: - description: Timestamp + example: '1' + date: + description: 'The Payment date' type: string - example: '2' - type: object - Expense: - properties: - id: - description: 'The expense hashed id' + example: 1-1-2014 + transaction_reference: + description: 'The transaction reference as defined by the payment gateway' type: string - example: 'Opnel5aKBz' - user_id: - description: 'The user hashed id' - type: string - example: 'Opnel5aKBz' + example: xcsSxcs124asd 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' + example: Opnel5aKBz private_notes: - description: 'The private notes of the expense' + description: 'The private notes of the payment' 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' + 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: 'Boolean determining whether the expense has been deleted' + description: 'Defines if the payment 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 - 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' + description: 'The amount of this payment' type: number example: 10 - currency_id: - description: 'The currency ID of the currency' + 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: '1' - account_type: - description: 'The account type' + 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: creditCard - description: - description: 'The description of the transaction' + example: PAY_101 + type: object + + BankTransactionRule: + properties: + id: + description: 'The bank transaction rules hashed id' type: string - example: 'Potato purchases for kevin' - category_id: - description: 'The category id' - type: integer - example: 1 - category_type: - description: 'The category description' + example: AS3df3A + user_id: + description: 'The user hashed id' type: string - example: Expenses - base_type: - description: 'Either CREDIT or DEBIT' + 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 - 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 - 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 - 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 - 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,]' - FillableInvoice: - properties: - assigned_user_id: - description: "The assigned user's hashed ID" - type: string - example: 'a1b2c3d4' client_id: - description: "The client's hashed ID" + description: 'The client hashed id' type: string - example: 'x1y2z3a4' - number: - description: "The unique alphanumeric invoice number for each invoice per company" + example: AS3df3A + vendor_id: + description: 'The vendor hashed id' type: string - example: INV_101 - po_number: - description: "The purchase order number associated with the invoice" + example: AS3df3A + category_id: + description: 'The category hashed id' 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 + example: AS3df3A type: object RecurringQuote: properties: @@ -16543,7 +15317,6 @@ components: description: 'The assigned user hashed id' type: string example: Opnel5aKBz - client_id: description: 'The client hashed id' type: string @@ -16752,1814 +15525,12 @@ components: type: boolean example: true 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 - 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 - 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 - - 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 - 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 - 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 - Quote: - properties: - id: - description: 'The unique hashed identifier for the quote' - 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' - type: string - example: '' - status_id: - description: 'The status of the quote represented by a unique identifier' - type: string - example: '' - number: - description: 'The unique alpha-numeric quote number for the quote per company' - type: string - example: QUOTE_101 - po_number: - description: 'The purchase order number associated with the quote' - 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' - 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 - 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 - - Task: - properties: - id: - description: 'The hashed id of the task' - type: string - example: Opnel5aKBz - user_id: - description: 'The hashed id of the user who created the task' - type: string - example: Opnel5aKBz - assigned_user_id: - description: 'The assigned user of the task' - type: string - example: Opnel5aKBz - - client_id: - description: 'The hashed if of the client' - type: string - example: Opnel5aKBz - invoice_id: - description: 'The hashed id of the invoice associated with the task' - type: string - example: Opnel5aKBz - project_id: - description: 'The hashed id of the project associated with the task' - type: string - example: Opnel5aKBz - number: - description: 'The number of the task' - type: string - example: TASK-123 - time_log: - description: 'An array of unix time stamps defining the start and end times of the task' - type: string - example: '[[1,2],[3,4]]' - is_running: - description: 'Determines if the task is still running' - type: boolean - example: true - is_deleted: - description: 'Boolean flag determining if the task has been deleted' - type: boolean - example: true - task_status_id: - description: 'The hashed id of the task status' - type: string - example: Opnel5aKBz - description: - description: 'The task description' - type: string - example: 'A wonder task to work on' - duration: - description: 'The task duration in seconds' - type: integer - example: '3600' - task_status_order: - description: 'The order of the task' - type: integer - example: '4' - rate: - description: 'The task rate' - type: number - example: 10.00 - custom_value1: - description: 'A custom value' - type: string - example: '2022-10-10' - custom_value2: - description: 'A custom value' - type: string - example: $1100 - custom_value3: - description: 'A custom value' - type: string - example: 'I need help' - custom_value4: - description: 'A custom value' - type: string - example: INV-3343 - is_date_based: - description: 'Boolean flag determining if the task is date based' - type: boolean - example: true - calculated_start_date: - description: 'The calculated start date of the task' - type: string - example: '2022-10-10' - readOnly: true - invoice_documents: - description: "Boolean flags which determines whether to include the task documents on the invoice" - type: boolean - example: true - created_at: - 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 - type: object - 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 - - 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' - 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 - - 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 - - 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 - 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 - 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 - 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 - 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 CompanyGateway: properties: id: description: 'The hashed id of the company gateway' type: string example: Opnel5aKBz - gateway_key: description: 'The gateway key (hash)' type: string @@ -18592,1505 +15563,6 @@ components: 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 - 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 - - - ClientSettings: - 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 - 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' - 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' - 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' - - 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 - ClientRequest: - required: - - contacts - - country_id - properties: - id: - description: 'The unique identifier of the client' - type: string - example: Opnel5aKBz - readOnly: true - contacts: - type: array - description: 'A list of contacts associated with the client' - items: - $ref: '#/components/schemas/ClientContactRequest' - 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' - 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 - 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 - classification: - description: 'The classification of the client' - type: string - example: 'individual' - settings: - $ref: '#/components/schemas/ClientSettings' - 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 - 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 CompanySettings: required: - currency_id @@ -20933,6 +16405,1593 @@ components: 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 company user permissions' + type: string + example: '[create_invoice]' + settings: + description: 'Settings that are used for the frontend applications to store user preferences / metadata' + type: object + react_settings: + description: 'Dedicated settings object for the react web application' + type: object + is_owner: + description: 'Determines whether the user owns this company' + type: boolean + example: true + is_admin: + description: 'Determines whether the user is the admin of this company' + type: boolean + example: true + is_locked: + description: 'Determines whether the users access to this company has been locked' + type: boolean + example: 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: + 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' + 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 + + 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 + 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 + 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 + + + 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 + Task: + properties: + id: + description: 'The hashed id of the task' + type: string + example: Opnel5aKBz + user_id: + description: 'The hashed id of the user who created the task' + type: string + example: Opnel5aKBz + assigned_user_id: + description: 'The assigned user of the task' + type: string + example: Opnel5aKBz + client_id: + description: 'The hashed if of the client' + type: string + example: Opnel5aKBz + invoice_id: + description: 'The hashed id of the invoice associated with the task' + type: string + example: Opnel5aKBz + project_id: + description: 'The hashed id of the project associated with the task' + type: string + example: Opnel5aKBz + number: + description: 'The number of the task' + type: string + example: TASK-123 + time_log: + description: 'An array of unix time stamps defining the start and end times of the task' + type: string + example: '[[1,2],[3,4]]' + is_running: + description: 'Determines if the task is still running' + type: boolean + example: true + is_deleted: + description: 'Boolean flag determining if the task has been deleted' + type: boolean + example: true + task_status_id: + description: 'The hashed id of the task status' + type: string + example: Opnel5aKBz + description: + description: 'The task description' + type: string + example: 'A wonder task to work on' + duration: + description: 'The task duration in seconds' + type: integer + example: '3600' + task_status_order: + description: 'The order of the task' + type: integer + example: '4' + rate: + description: 'The task rate' + type: number + example: 10.00 + custom_value1: + description: 'A custom value' + type: string + example: '2022-10-10' + custom_value2: + description: 'A custom value' + type: string + example: $1100 + custom_value3: + description: 'A custom value' + type: string + example: 'I need help' + custom_value4: + description: 'A custom value' + type: string + example: INV-3343 + is_date_based: + description: 'Boolean flag determining if the task is date based' + type: boolean + example: true + calculated_start_date: + description: 'The calculated start date of the task' + type: string + example: '2022-10-10' + readOnly: true + invoice_documents: + description: "Boolean flags which determines whether to include the task documents on the invoice" + type: boolean + example: true + created_at: + 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 + type: object ClientContact: properties: id: @@ -20945,7 +18004,6 @@ components: type: string example: Opnel5aKBz readOnly: true - client_id: description: 'The hashed id of the client' type: string @@ -21060,236 +18118,2827 @@ components: example: '134341234234' readOnly: true type: object - - FeesAndLimits: + ClientContactRequest: properties: - min_limit: - description: 'The minimum amount accepted for this gateway' + id: + description: 'The hashed if of the contact' type: string - example: '2' - max_limit: - description: 'The maximum amount accepted for this gateway' + example: Opnel5aKBz + readOnly: true + first_name: + description: 'The first name of the contact' 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' + example: John + last_name: + description: 'The last name of the contact' type: string - example: GST - fee_tax_name2: - description: 'Fee tax name' + example: Doe + phone: + description: 'The phone number of the contact' type: string - example: VAT - fee_tax_name3: - description: 'Fee tax name' + example: 555-152-4524 + custom_value1: + description: 'A Custom field value' 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.' + 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 - Account: + VendorContact: properties: id: - description: 'The account hashed id' + description: 'The hashed id of the vendor contact' type: string - example: AS3df3A - account_sms_verified: - description: 'Boolean flag if the account has been verified by sms' + 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 - BankTransactionRule: + Subscription: properties: id: - description: 'The bank transaction rules hashed id' + description: Unique identifier for the subscription type: string - example: AS3df3A + 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 user_id: description: 'The user hashed id' type: string - example: AS3df3A - name: - description: 'The name of the transaction' + example: Opnel5aKBz + assigned_user_id: + description: 'The assigned user hashed id' 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 + example: Opnel5aKBz client_id: description: 'The client hashed id' type: string - example: AS3df3A - vendor_id: - description: 'The vendor hashed id' + example: Opnel5aKBz + status_id: + description: 'The invoice status variable' type: string - example: AS3df3A - category_id: - description: 'The category hashed id' + 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: AS3df3A - type: object - CompanyToken: - properties: - name: - description: 'The token name' + example: INV_101 + po_number: + description: 'The purchase order associated with this recurring invoice' type: string - example: 'Token Name' - token: - description: 'The token value' + example: PO-1234 + terms: + description: 'The invoice terms' type: string - example: AS3df3jUUH765fhfd9KJuidj3JShjA - is_system: - description: 'Determines whether the token is created by the system rather than a user' + 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' - type: object - CompanyUser: - properties: - permissions: - description: 'The company user permissions' + 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 - example: '[create_invoice]' + 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: - description: 'Settings that are used for the frontend applications to store user preferences / metadata' - type: object - react_settings: - description: 'Dedicated settings object for the react web application' - type: object - is_owner: - description: 'Determines whether the user owns this company' - type: boolean - example: true - is_admin: - description: 'Determines whether the user is the admin of this company' - type: boolean - example: true - is_locked: - description: 'Determines whether the users access to this company has been locked' - type: boolean - example: true + $ref: '#/components/schemas/CompanySettings' + last_viewed: + description: Timestamp + type: number + format: integer + example: '1434342123' 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' + 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 - InvoiceInvitationRequest: - required: - - client_contact_id + + Quote: properties: id: - description: 'The entity invitation hashed id' + description: 'The unique hashed identifier for the quote' + 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' + type: string + example: '' + status_id: + description: 'The status of the quote represented by a unique identifier' + type: string + example: '' + number: + description: 'The unique alpha-numeric quote number for the quote per company' + type: string + example: QUOTE_101 + po_number: + description: 'The purchase order number associated with the quote' + 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' + 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 + type: object + Invoice: + properties: + id: + description: 'The invoice hashed id' type: string example: Opnel5aKBz readOnly: true - client_contact_id: - description: 'The client contact hashed id' + user_id: + description: 'The user hashed id' type: string example: Opnel5aKBz - key: - description: 'The invitation key' - type: string - example: Opnel5aKBz4343343566236gvbb readOnly: true - link: - description: 'The invitation link' + assigned_user_id: + description: 'The assigned user hashed id' type: string - example: 'https://www.example.com/invitations/Opnel5aKBz4343343566236gvbb' + example: Opnel5aKBz + client_id: + description: 'The client hashed id' + type: string + example: Opnel5aKBz + status_id: + description: 'The invoice status variable' + type: string + example: '4' + 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' + 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/InvoiceInvitation' + 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' + 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 + project_id: + description: 'The project associated with this invoice' + type: string + example: Opnel5aKBz + auto_bill_tries: + description: 'The number of times the invoice has attempted to be auto billed' + type: integer + example: '1' readOnly: true - sent_date: - description: 'The invitation sent date' + auto_bill_enabled: + description: 'Boolean flag determining if the invoice is set to auto bill' + type: boolean + example: true + subscription_id: + description: 'The subscription associated with this invoice' type: string - format: date-time + example: Opnel5aKBz + + type: object + ClientRequest: + required: + - contacts + - country_id + properties: + id: + description: 'The unique identifier of the client' + type: string + example: Opnel5aKBz readOnly: true - viewed_date: - description: 'The invitation viewed date' + contacts: + type: array + description: 'A list of contacts associated with the client' + items: + $ref: '#/components/schemas/ClientContactRequest' + name: + description: 'The name of the client company or organization' type: string - format: date-time + 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' + 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 - opened_date: - description: 'The invitation opened date' + group_settings_id: + description: 'The group settings assigned to the client' type: string - format: date-time + 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 + classification: + description: 'The classification of the client' + type: string + example: 'individual' + settings: + $ref: '#/components/schemas/ClientSettings' + 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' + 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 + ClientSettings: + 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 + 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' + 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' + 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' - readOnly: true archived_at: - description: 'Timestamp' + description: Timestamp type: number format: integer example: '1434342123' - readOnly: true - email_error: - description: 'The email error' + type: object + Activity: + properties: + id: + description: 'The id field of the activity' type: string - example: 'The email error' - readOnly: true - email_status: - description: 'The email status' + example: Opnel5aKBz + activity_type_id: + description: 'The activity type id' type: string - readOnly: true - + 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: @@ -21348,47 +20997,376 @@ components: type: string readOnly: true - Design: + + 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 design hashed id' + description: 'The hashed id of the user' type: string - example: AS3df3A - name: - description: 'The design name' + example: Opnel5aKBz + readOnly: true + first_name: + description: 'The first name of the user' type: string - example: Beauty - design: - description: 'The design HTML' + example: Brad + last_name: + description: 'The last name of the user' type: string - example: '' - is_custom: - description: 'Flag to determine if the design is a custom user design' + 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 - is_active: - description: 'Flag to determine if the design is available for use' + 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" + 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: 'Flag to determine if the design 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 - created_at: - description: Timestamp + 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: '134341234234' + example: 1434342123 updated_at: - description: Timestamp + description: "The timestamp of the last time the credit was updated" type: number format: integer - example: '134341234234' - deleted_at: - description: Timestamp + example: 1434342123 + archived_at: + description: "The timestamp of the last time the credit was archived" type: number format: integer - example: '134341234234' + 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 tags: - name: login diff --git a/openapi/components/schemas/expense.yaml b/openapi/components/schemas/expense.yaml index 72c690638fb1..9a9b6ec5116e 100644 --- a/openapi/components/schemas/expense.yaml +++ b/openapi/components/schemas/expense.yaml @@ -16,10 +16,6 @@ description: 'The associated project_id' type: string example: 'Opnel5aKBz' - company_id: - description: 'The company hashed id' - type: string - example: 'Opnel5aKBz' client_id: description: 'The client hashed id' type: string diff --git a/openapi/components/schemas/invoice.yaml b/openapi/components/schemas/invoice.yaml index 6993aed7e6b4..da35f9da3b9a 100644 --- a/openapi/components/schemas/invoice.yaml +++ b/openapi/components/schemas/invoice.yaml @@ -14,11 +14,6 @@ description: 'The assigned user hashed id' type: string example: Opnel5aKBz - company_id: - description: 'The company hashed id' - type: string - example: Opnel5aKBz - readOnly: true client_id: description: 'The client hashed id' type: string diff --git a/openapi/components/schemas/invoice_request.yaml b/openapi/components/schemas/invoice_request.yaml index 3998dfac6498..463ed3ab0bb5 100644 --- a/openapi/components/schemas/invoice_request.yaml +++ b/openapi/components/schemas/invoice_request.yaml @@ -15,11 +15,6 @@ description: 'The assigned user hashed id' type: string example: Opnel5aKBz - company_id: - description: 'The company hashed id' - type: string - example: Opnel5aKBz - readOnly: true client_id: description: 'The client hashed id' type: string diff --git a/openapi/components/schemas/product.yaml b/openapi/components/schemas/product.yaml index 52480f71978b..ff986e527094 100644 --- a/openapi/components/schemas/product.yaml +++ b/openapi/components/schemas/product.yaml @@ -6,11 +6,6 @@ description: 'The hashed product ID.' example: eP01N readOnly: true - company_id: - type: string - description: 'The hashed ID of the company that owns this product.' - example: eP01N - readOnly: true user_id: type: string description: 'The hashed ID of the user that created this product.' diff --git a/openapi/components/schemas/purchase_order.yaml b/openapi/components/schemas/purchase_order.yaml index 3202309b4408..eb9516b30692 100644 --- a/openapi/components/schemas/purchase_order.yaml +++ b/openapi/components/schemas/purchase_order.yaml @@ -12,10 +12,6 @@ description: 'The unique hashed identifier for the user assigned to the purchase order' type: string example: '' - company_id: - description: 'The unique hashed identifier for the company associated with the purchase order' - type: string - example: '' vendor_id: description: 'The unique hashed identifier for the vendor associated with the purchase order' type: string diff --git a/openapi/components/schemas/quote.yaml b/openapi/components/schemas/quote.yaml index 3b7b00a6fb57..6fd62bf89b61 100644 --- a/openapi/components/schemas/quote.yaml +++ b/openapi/components/schemas/quote.yaml @@ -12,10 +12,6 @@ description: 'The unique hashed identifier for the user assigned to the quote' type: string example: '' - company_id: - description: 'The unique hashed identifier for the company associated with the quote' - type: string - example: '' client_id: description: 'The unique hashed identifier for the client associated with the quote' type: string diff --git a/openapi/components/schemas/recurring_expense.yaml b/openapi/components/schemas/recurring_expense.yaml index 747b89baeff7..497b2748cf14 100644 --- a/openapi/components/schemas/recurring_expense.yaml +++ b/openapi/components/schemas/recurring_expense.yaml @@ -12,10 +12,6 @@ description: 'The hashed id of the user assigned to this recurring expense' type: string example: Opnel5aKBz - company_id: - description: 'The hashed id of the company' - type: string - example: Opnel5aKBz client_id: description: 'The hashed id of the client' type: string diff --git a/openapi/components/schemas/recurring_invoice.yaml b/openapi/components/schemas/recurring_invoice.yaml index 933592f5c04e..dd94a2df9e4a 100644 --- a/openapi/components/schemas/recurring_invoice.yaml +++ b/openapi/components/schemas/recurring_invoice.yaml @@ -12,10 +12,6 @@ description: 'The assigned user hashed id' type: string example: Opnel5aKBz - company_id: - description: 'The company hashed id' - type: string - example: Opnel5aKBz client_id: description: 'The client hashed id' type: string diff --git a/openapi/components/schemas/recurring_quote.yaml b/openapi/components/schemas/recurring_quote.yaml index 98e67953cd73..81e7d286b615 100644 --- a/openapi/components/schemas/recurring_quote.yaml +++ b/openapi/components/schemas/recurring_quote.yaml @@ -12,10 +12,6 @@ description: 'The assigned user hashed id' type: string example: Opnel5aKBz - company_id: - description: 'The company hashed id' - type: string - example: Opnel5aKBz client_id: description: 'The client hashed id' type: string diff --git a/openapi/components/schemas/subscription.yaml b/openapi/components/schemas/subscription.yaml index da8346dcfbc5..f1e42435d12d 100644 --- a/openapi/components/schemas/subscription.yaml +++ b/openapi/components/schemas/subscription.yaml @@ -12,10 +12,6 @@ description: Unique identifier for the product associated with the subscription type: string example: Pr5Ft7yBmC - company_id: - description: Unique identifier for the company associated with the subscription - type: string - example: Co7Vn3yLmW recurring_invoice_id: description: Unique identifier for the recurring invoice associated with the subscription type: string diff --git a/openapi/components/schemas/system_log.yaml b/openapi/components/schemas/system_log.yaml index cdce0ebd4b62..9947473f4c85 100644 --- a/openapi/components/schemas/system_log.yaml +++ b/openapi/components/schemas/system_log.yaml @@ -4,10 +4,6 @@ description: 'The account hashed id' type: string example: AS3df3A - company_id: - description: 'The company hashed id' - type: string - example: AS3df3A user_id: description: 'The user_id hashed id' type: string diff --git a/openapi/components/schemas/task.yaml b/openapi/components/schemas/task.yaml index ec6089548bb1..3b235f48d5ba 100644 --- a/openapi/components/schemas/task.yaml +++ b/openapi/components/schemas/task.yaml @@ -12,10 +12,6 @@ description: 'The assigned user of the task' type: string example: Opnel5aKBz - company_id: - description: 'The hashed id of the company' - type: string - example: Opnel5aKBz client_id: description: 'The hashed if of the client' type: string diff --git a/openapi/components/schemas/vendor.yaml b/openapi/components/schemas/vendor.yaml index 7af19f263ee5..d9d6437f45a3 100644 --- a/openapi/components/schemas/vendor.yaml +++ b/openapi/components/schemas/vendor.yaml @@ -13,10 +13,6 @@ description: 'The hashed id of the assigned user to this vendor. This is a unique identifier for the user.' type: string example: Opnel5aKBz - company_id: - description: 'The hashed id of the company. This is a unique identifier for the company.' - type: string - example: Opnel5aKBz contacts: type: array items: diff --git a/openapi/components/schemas/vendor_contact.yaml b/openapi/components/schemas/vendor_contact.yaml index f2c57c53cf59..6800fed8e257 100644 --- a/openapi/components/schemas/vendor_contact.yaml +++ b/openapi/components/schemas/vendor_contact.yaml @@ -10,11 +10,6 @@ type: string example: Opnel5aKBz readOnly: true - company_id: - description: 'The hashed id of the company' - type: string - example: Opnel5aKBz - readOnly: true vendor_id: description: 'The hashed id of the vendor' type: string From bbcbfe9821777329fc76851bc7b62f9028764839 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 8 Mar 2024 08:16:39 +1100 Subject: [PATCH 16/21] Fixes for recurring invoices - restarting completed recurring invoices --- app/Console/Commands/CheckData.php | 2 +- app/Models/RecurringInvoice.php | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/Console/Commands/CheckData.php b/app/Console/Commands/CheckData.php index b843f33cb9e4..2941f2223d5a 100644 --- a/app/Console/Commands/CheckData.php +++ b/app/Console/Commands/CheckData.php @@ -884,7 +884,7 @@ class CheckData extends Command public function checkClientSettings() { if ($this->option('fix') == 'true') { - Client::query()->whereNull('country_id')->cursor()->each(function ($client) { + Client::query()->whereNull('country_id')->orWhere('country_id', 0)->cursor()->each(function ($client) { $client->country_id = $client->company->settings->country_id; $client->saveQuietly(); diff --git a/app/Models/RecurringInvoice.php b/app/Models/RecurringInvoice.php index a29e9f4023b6..0dd433c6be72 100644 --- a/app/Models/RecurringInvoice.php +++ b/app/Models/RecurringInvoice.php @@ -355,11 +355,13 @@ class RecurringInvoice extends BaseModel public function calculateStatus(bool $new_model = false) //15-02-2024 - $new_model needed { - if($this->remaining_cycles == 0) { + if($this->remaining_cycles == 0) return self::STATUS_COMPLETED; - } elseif ($new_model && $this->status_id == self::STATUS_ACTIVE && Carbon::parse($this->next_send_date)->isFuture()) + elseif ($new_model && $this->status_id == self::STATUS_ACTIVE && Carbon::parse($this->next_send_date)->isFuture()) return self::STATUS_PENDING; - + elseif($this->remaining_cycles != 0) + return self::STATUS_ACTIVE; + return $this->status_id; } From 5ed098fc9c20d4c6734d6916ef8bc600c27c874a Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 8 Mar 2024 10:05:48 +1100 Subject: [PATCH 17/21] Fixes for tests --- .../Requests/Invoice/StoreInvoiceRequest.php | 2 +- .../Requests/Invoice/UpdateInvoiceRequest.php | 2 +- .../TaskScheduler/StoreSchedulerRequest.php | 34 +++++++++++++++++-- app/Models/Gateway.php | 2 +- app/Models/RecurringInvoice.php | 2 +- 5 files changed, 36 insertions(+), 6 deletions(-) diff --git a/app/Http/Requests/Invoice/StoreInvoiceRequest.php b/app/Http/Requests/Invoice/StoreInvoiceRequest.php index 4381f4abcb3b..393ada465aa0 100644 --- a/app/Http/Requests/Invoice/StoreInvoiceRequest.php +++ b/app/Http/Requests/Invoice/StoreInvoiceRequest.php @@ -114,7 +114,7 @@ class StoreInvoiceRequest extends Request } //handles edge case where we need for force set the due date of the invoice. - if((isset($input['partial_due_date']) && strlen($input['partial_due_date']) > 1) && (!array_key_exists('due_date', $input) || strlen($input['due_date']) == 0)) { + if((isset($input['partial_due_date']) && strlen($input['partial_due_date']) > 1) && (!array_key_exists('due_date', $input) || (empty($input['due_date']) && empty($this->invoice->due_date)))) { $client = \App\Models\Client::withTrashed()->find($input['client_id']); $input['due_date'] = \Illuminate\Support\Carbon::parse($input['date'])->addDays($client->getSetting('payment_terms'))->format('Y-m-d'); } diff --git a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php index ce96da492d5d..42d32ef81479 100644 --- a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php +++ b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php @@ -109,7 +109,7 @@ class UpdateInvoiceRequest extends Request } //handles edge case where we need for force set the due date of the invoice. - if((isset($input['partial_due_date']) && strlen($input['partial_due_date']) > 1) && (!array_key_exists('due_date', $input) || strlen($input['due_date']) == 0 || empty($this->invoice->due_date))) { + if((isset($input['partial_due_date']) && strlen($input['partial_due_date']) > 1) && (!array_key_exists('due_date', $input) || (empty($input['due_date']) && empty($this->invoice->due_date)))) { $client = \App\Models\Client::withTrashed()->find($input['client_id']); $input['due_date'] = \Illuminate\Support\Carbon::parse($input['date'])->addDays($client->getSetting('payment_terms'))->format('Y-m-d'); } diff --git a/app/Http/Requests/TaskScheduler/StoreSchedulerRequest.php b/app/Http/Requests/TaskScheduler/StoreSchedulerRequest.php index 42416cea35c6..9ec78ec0d163 100644 --- a/app/Http/Requests/TaskScheduler/StoreSchedulerRequest.php +++ b/app/Http/Requests/TaskScheduler/StoreSchedulerRequest.php @@ -18,6 +18,28 @@ use App\Utils\Traits\MakesHash; class StoreSchedulerRequest extends Request { use MakesHash; + + public array $client_statuses = [ + 'all', + 'draft', + 'paid', + 'unpaid', + 'overdue', + 'pending', + 'invoiced', + 'logged', + 'partial', + 'applied', + 'active', + 'paused', + 'completed', + 'approved', + 'expired', + 'upcoming', + 'converted', + 'uninvoiced', + ]; + /** * Determine if the user is authorized to make this request. * @@ -73,10 +95,18 @@ class StoreSchedulerRequest extends Request if(isset($input['parameters']['status'])) { + $task_statuses = []; + + if($input['parameters']['report_name'] == 'task') { + $task_statuses = array_diff(explode(",", $input['parameters']['status']), $this->client_statuses); + } + $input['parameters']['status'] = collect(explode(",", $input['parameters']['status'])) ->filter(function ($status) { - return in_array($status, ['all','draft','paid','unpaid','overdue']); - })->implode(",") ?? ''; + return in_array($status, $this->client_statuses); + })->merge($task_statuses) + ->implode(",") ?? ''; + } $this->replace($input); diff --git a/app/Models/Gateway.php b/app/Models/Gateway.php index 2ad0664ad4e6..4fc95e00b9a1 100644 --- a/app/Models/Gateway.php +++ b/app/Models/Gateway.php @@ -137,7 +137,7 @@ class Gateway extends StaticModel case 56: return [ GatewayType::CREDIT_CARD => ['refund' => true, 'token_billing' => true, 'webhooks' => ['payment_intent.succeeded', 'payment_intent.payment_failed']], - GatewayType::BANK_TRANSFER => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'customer.source.updated','payment_intent.processing', 'payment_intent.payment_failed']], + GatewayType::BANK_TRANSFER => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'customer.source.updated','payment_intent.processing', 'payment_intent.payment_failed', 'charge.failed']], GatewayType::DIRECT_DEBIT => ['refund' => false, 'token_billing' => false, 'webhooks' => ['payment_intent.processing','payment_intent.succeeded','payment_intent.partially_funded', 'payment_intent.payment_failed']], GatewayType::ALIPAY => ['refund' => false, 'token_billing' => false], GatewayType::APPLE_PAY => ['refund' => false, 'token_billing' => false], diff --git a/app/Models/RecurringInvoice.php b/app/Models/RecurringInvoice.php index 0dd433c6be72..c87375b3dcf6 100644 --- a/app/Models/RecurringInvoice.php +++ b/app/Models/RecurringInvoice.php @@ -359,7 +359,7 @@ class RecurringInvoice extends BaseModel return self::STATUS_COMPLETED; elseif ($new_model && $this->status_id == self::STATUS_ACTIVE && Carbon::parse($this->next_send_date)->isFuture()) return self::STATUS_PENDING; - elseif($this->remaining_cycles != 0) + elseif($this->remaining_cycles != 0 && ($this->status_id == self::STATUS_COMPLETED)) return self::STATUS_ACTIVE; return $this->status_id; From 3564bb89359eac1398edcd09d45f071d2b02e1e3 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 8 Mar 2024 13:13:19 +1100 Subject: [PATCH 18/21] Fixes for task status requests --- .../TaskScheduler/StoreSchedulerRequest.php | 5 +- .../TaskScheduler/UpdateSchedulerRequest.php | 33 +++- app/Models/Gateway.php | 24 +-- composer.lock | 156 +++++++++--------- 4 files changed, 122 insertions(+), 96 deletions(-) diff --git a/app/Http/Requests/TaskScheduler/StoreSchedulerRequest.php b/app/Http/Requests/TaskScheduler/StoreSchedulerRequest.php index 9ec78ec0d163..158a9d37cf4e 100644 --- a/app/Http/Requests/TaskScheduler/StoreSchedulerRequest.php +++ b/app/Http/Requests/TaskScheduler/StoreSchedulerRequest.php @@ -13,12 +13,9 @@ namespace App\Http\Requests\TaskScheduler; use App\Http\Requests\Request; use App\Http\ValidationRules\Scheduler\ValidClientIds; -use App\Utils\Traits\MakesHash; class StoreSchedulerRequest extends Request { - use MakesHash; - public array $client_statuses = [ 'all', 'draft', @@ -97,7 +94,7 @@ class StoreSchedulerRequest extends Request $task_statuses = []; - if($input['parameters']['report_name'] == 'task') { + if(isset($input['parameters']['report_name']) && $input['parameters']['report_name'] == 'task') { $task_statuses = array_diff(explode(",", $input['parameters']['status']), $this->client_statuses); } diff --git a/app/Http/Requests/TaskScheduler/UpdateSchedulerRequest.php b/app/Http/Requests/TaskScheduler/UpdateSchedulerRequest.php index 934002eb0bdd..9a21d7183003 100644 --- a/app/Http/Requests/TaskScheduler/UpdateSchedulerRequest.php +++ b/app/Http/Requests/TaskScheduler/UpdateSchedulerRequest.php @@ -16,6 +16,27 @@ use App\Http\ValidationRules\Scheduler\ValidClientIds; class UpdateSchedulerRequest extends Request { + public array $client_statuses = [ + 'all', + 'draft', + 'paid', + 'unpaid', + 'overdue', + 'pending', + 'invoiced', + 'logged', + 'partial', + 'applied', + 'active', + 'paused', + 'completed', + 'approved', + 'expired', + 'upcoming', + 'converted', + 'uninvoiced', + ]; + /** * Determine if the user is authorized to make this request. * @@ -71,10 +92,18 @@ class UpdateSchedulerRequest extends Request if(isset($input['parameters']['status'])) { + +$task_statuses = []; + + if(isset($input['parameters']['report_name']) && $input['parameters']['report_name'] == 'task') { + $task_statuses = array_diff(explode(",", $input['parameters']['status']), $this->client_statuses); + } + $input['parameters']['status'] = collect(explode(",", $input['parameters']['status'])) ->filter(function ($status) { - return in_array($status, ['all','draft','paid','unpaid','overdue']); - })->implode(",") ?? ''; + return in_array($status, $this->client_statuses); + })->merge($task_statuses) + ->implode(",") ?? ''; } $this->replace($input); diff --git a/app/Models/Gateway.php b/app/Models/Gateway.php index 4fc95e00b9a1..b6194eb25b2f 100644 --- a/app/Models/Gateway.php +++ b/app/Models/Gateway.php @@ -141,18 +141,18 @@ class Gateway extends StaticModel GatewayType::DIRECT_DEBIT => ['refund' => false, 'token_billing' => false, 'webhooks' => ['payment_intent.processing','payment_intent.succeeded','payment_intent.partially_funded', 'payment_intent.payment_failed']], GatewayType::ALIPAY => ['refund' => false, 'token_billing' => false], GatewayType::APPLE_PAY => ['refund' => false, 'token_billing' => false], - GatewayType::BACS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.processing', 'payment_intent.succeeded', 'mandate.updated', 'payment_intent.payment_failed']], - GatewayType::SOFORT => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']], - GatewayType::KLARNA => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']], - GatewayType::SEPA => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']], - GatewayType::PRZELEWY24 => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']], - GatewayType::GIROPAY => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']], - GatewayType::EPS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']], - GatewayType::BANCONTACT => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']], - GatewayType::BECS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']], - GatewayType::IDEAL => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']], - GatewayType::ACSS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'payment_intent.succeeded', 'payment_intent.payment_failed']], - GatewayType::FPX => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded']], + GatewayType::BACS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.processing', 'payment_intent.succeeded', 'mandate.updated', 'payment_intent.payment_failed']], + GatewayType::SOFORT => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']], + GatewayType::KLARNA => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']], + GatewayType::SEPA => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']], + GatewayType::PRZELEWY24 => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']], + GatewayType::GIROPAY => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']], + GatewayType::EPS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']], + GatewayType::BANCONTACT => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']], + GatewayType::BECS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']], + GatewayType::IDEAL => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']], + GatewayType::ACSS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed']], + GatewayType::FPX => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded', 'charge.failed', ]], ]; case 39: return [GatewayType::CREDIT_CARD => ['refund' => true, 'token_billing' => true, 'webhooks' => [' ']]]; //Checkout diff --git a/composer.lock b/composer.lock index 6777702814ae..b7a547baa11e 100644 --- a/composer.lock +++ b/composer.lock @@ -971,16 +971,16 @@ }, { "name": "apimatic/core-interfaces", - "version": "0.1.2", + "version": "0.1.3", "source": { "type": "git", "url": "https://github.com/apimatic/core-interfaces-php.git", - "reference": "183214195a79784c382a446795c46ca8c1f43cc1" + "reference": "fad0d992a3900636865bc4b3a7c4dd77ae10d22f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/apimatic/core-interfaces-php/zipball/183214195a79784c382a446795c46ca8c1f43cc1", - "reference": "183214195a79784c382a446795c46ca8c1f43cc1", + "url": "https://api.github.com/repos/apimatic/core-interfaces-php/zipball/fad0d992a3900636865bc4b3a7c4dd77ae10d22f", + "reference": "fad0d992a3900636865bc4b3a7c4dd77ae10d22f", "shasum": "" }, "require": { @@ -1008,9 +1008,9 @@ ], "support": { "issues": "https://github.com/apimatic/core-interfaces-php/issues", - "source": "https://github.com/apimatic/core-interfaces-php/tree/0.1.2" + "source": "https://github.com/apimatic/core-interfaces-php/tree/0.1.3" }, - "time": "2023-04-04T06:40:52+00:00" + "time": "2024-03-07T04:56:42+00:00" }, { "name": "apimatic/jsonmapper", @@ -1343,16 +1343,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.300.10", + "version": "3.300.13", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "b24bf7882fed0ef029996dcdcba6c273b69db8fe" + "reference": "b1eb7307d30ebcfa4e156971f658c2d177434db3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/b24bf7882fed0ef029996dcdcba6c273b69db8fe", - "reference": "b24bf7882fed0ef029996dcdcba6c273b69db8fe", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/b1eb7307d30ebcfa4e156971f658c2d177434db3", + "reference": "b1eb7307d30ebcfa4e156971f658c2d177434db3", "shasum": "" }, "require": { @@ -1432,9 +1432,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.300.10" + "source": "https://github.com/aws/aws-sdk-php/tree/3.300.13" }, - "time": "2024-03-04T19:06:07+00:00" + "time": "2024-03-07T19:14:04+00:00" }, { "name": "bacon/bacon-qr-code", @@ -1544,16 +1544,16 @@ }, { "name": "braintree/braintree_php", - "version": "6.16.0", + "version": "6.17.0", "source": { "type": "git", "url": "https://github.com/braintree/braintree_php.git", - "reference": "fe3d852149ae7f0c3a8f193c7875468ea4e2d5f7" + "reference": "37c187c91416003708632a58c230d03dbe88fb67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/braintree/braintree_php/zipball/fe3d852149ae7f0c3a8f193c7875468ea4e2d5f7", - "reference": "fe3d852149ae7f0c3a8f193c7875468ea4e2d5f7", + "url": "https://api.github.com/repos/braintree/braintree_php/zipball/37c187c91416003708632a58c230d03dbe88fb67", + "reference": "37c187c91416003708632a58c230d03dbe88fb67", "shasum": "" }, "require": { @@ -1587,9 +1587,9 @@ "description": "Braintree PHP Client Library", "support": { "issues": "https://github.com/braintree/braintree_php/issues", - "source": "https://github.com/braintree/braintree_php/tree/6.16.0" + "source": "https://github.com/braintree/braintree_php/tree/6.17.0" }, - "time": "2024-01-09T22:07:58+00:00" + "time": "2024-03-06T20:01:30+00:00" }, { "name": "brick/math", @@ -2806,16 +2806,16 @@ }, { "name": "endroid/qr-code", - "version": "5.0.5", + "version": "5.0.6", "source": { "type": "git", "url": "https://github.com/endroid/qr-code.git", - "reference": "739fc545bfade2470765219dc2a615a6f1e94987" + "reference": "3a9cc61d2d34df93f6edc2140e7880966ee7860f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/endroid/qr-code/zipball/739fc545bfade2470765219dc2a615a6f1e94987", - "reference": "739fc545bfade2470765219dc2a615a6f1e94987", + "url": "https://api.github.com/repos/endroid/qr-code/zipball/3a9cc61d2d34df93f6edc2140e7880966ee7860f", + "reference": "3a9cc61d2d34df93f6edc2140e7880966ee7860f", "shasum": "" }, "require": { @@ -2869,7 +2869,7 @@ ], "support": { "issues": "https://github.com/endroid/qr-code/issues", - "source": "https://github.com/endroid/qr-code/tree/5.0.5" + "source": "https://github.com/endroid/qr-code/tree/5.0.6" }, "funding": [ { @@ -2877,7 +2877,7 @@ "type": "github" } ], - "time": "2024-03-03T18:17:54+00:00" + "time": "2024-03-06T22:34:02+00:00" }, { "name": "eway/eway-rapid-php", @@ -5295,16 +5295,16 @@ }, { "name": "laravel/framework", - "version": "v10.46.0", + "version": "v10.47.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "5e95946a8283a8d5c015035793f9c61c297e937f" + "reference": "fce29b8de62733cdecbe12e3bae801f83fff2ea4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/5e95946a8283a8d5c015035793f9c61c297e937f", - "reference": "5e95946a8283a8d5c015035793f9c61c297e937f", + "url": "https://api.github.com/repos/laravel/framework/zipball/fce29b8de62733cdecbe12e3bae801f83fff2ea4", + "reference": "fce29b8de62733cdecbe12e3bae801f83fff2ea4", "shasum": "" }, "require": { @@ -5497,7 +5497,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-02-27T16:46:54+00:00" + "time": "2024-03-05T15:18:36+00:00" }, { "name": "laravel/prompts", @@ -5815,16 +5815,16 @@ }, { "name": "laravel/ui", - "version": "v4.4.0", + "version": "v4.5.0", "source": { "type": "git", "url": "https://github.com/laravel/ui.git", - "reference": "7335d7049b2cde345c029e9d2de839b80af62bc0" + "reference": "da3811f409297d13feccd5858ce748e7474b3d11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/ui/zipball/7335d7049b2cde345c029e9d2de839b80af62bc0", - "reference": "7335d7049b2cde345c029e9d2de839b80af62bc0", + "url": "https://api.github.com/repos/laravel/ui/zipball/da3811f409297d13feccd5858ce748e7474b3d11", + "reference": "da3811f409297d13feccd5858ce748e7474b3d11", "shasum": "" }, "require": { @@ -5835,8 +5835,8 @@ "php": "^8.0" }, "require-dev": { - "orchestra/testbench": "^7.0|^8.0|^9.0", - "phpunit/phpunit": "^9.3|^10.4" + "orchestra/testbench": "^7.35|^8.15|^9.0", + "phpunit/phpunit": "^9.3|^10.4|^11.0" }, "type": "library", "extra": { @@ -5871,9 +5871,9 @@ "ui" ], "support": { - "source": "https://github.com/laravel/ui/tree/v4.4.0" + "source": "https://github.com/laravel/ui/tree/v4.5.0" }, - "time": "2024-01-12T15:56:45+00:00" + "time": "2024-03-04T13:58:27+00:00" }, { "name": "lcobucci/clock", @@ -6946,16 +6946,16 @@ }, { "name": "livewire/livewire", - "version": "v3.4.6", + "version": "v3.4.7", "source": { "type": "git", "url": "https://github.com/livewire/livewire.git", - "reference": "7e7d638183b34fb61621455891869f5abfd55a82" + "reference": "05f25dab062cd6a1ec24d8df9e889f890c832cb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/7e7d638183b34fb61621455891869f5abfd55a82", - "reference": "7e7d638183b34fb61621455891869f5abfd55a82", + "url": "https://api.github.com/repos/livewire/livewire/zipball/05f25dab062cd6a1ec24d8df9e889f890c832cb0", + "reference": "05f25dab062cd6a1ec24d8df9e889f890c832cb0", "shasum": "" }, "require": { @@ -7009,7 +7009,7 @@ "description": "A front-end framework for Laravel.", "support": { "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v3.4.6" + "source": "https://github.com/livewire/livewire/tree/v3.4.7" }, "funding": [ { @@ -7017,7 +7017,7 @@ "type": "github" } ], - "time": "2024-02-20T14:04:25+00:00" + "time": "2024-03-05T15:54:03+00:00" }, { "name": "maennchen/zipstream-php", @@ -7936,16 +7936,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.0.1", + "version": "v5.0.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "2218c2252c874a4624ab2f613d86ac32d227bc69" + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/2218c2252c874a4624ab2f613d86ac32d227bc69", - "reference": "2218c2252c874a4624ab2f613d86ac32d227bc69", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", "shasum": "" }, "require": { @@ -7988,9 +7988,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" }, - "time": "2024-02-21T19:24:10+00:00" + "time": "2024-03-05T20:51:40+00:00" }, { "name": "nordigen/nordigen-php", @@ -8978,16 +8978,16 @@ }, { "name": "php-http/message", - "version": "1.16.0", + "version": "1.16.1", "source": { "type": "git", "url": "https://github.com/php-http/message.git", - "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd" + "reference": "5997f3289332c699fa2545c427826272498a2088" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/47a14338bf4ebd67d317bf1144253d7db4ab55fd", - "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd", + "url": "https://api.github.com/repos/php-http/message/zipball/5997f3289332c699fa2545c427826272498a2088", + "reference": "5997f3289332c699fa2545c427826272498a2088", "shasum": "" }, "require": { @@ -9041,9 +9041,9 @@ ], "support": { "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.16.0" + "source": "https://github.com/php-http/message/tree/1.16.1" }, - "time": "2023-05-17T06:43:38+00:00" + "time": "2024-03-07T13:22:09+00:00" }, { "name": "php-http/message-factory", @@ -11380,16 +11380,16 @@ }, { "name": "smalot/pdfparser", - "version": "v2.8.0", + "version": "v2.9.0", "source": { "type": "git", "url": "https://github.com/smalot/pdfparser.git", - "reference": "268a620b96523eb4244c42931885024c8db8dae1" + "reference": "6b53144fcb24af77093d4150dd7d0dd571f25761" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/smalot/pdfparser/zipball/268a620b96523eb4244c42931885024c8db8dae1", - "reference": "268a620b96523eb4244c42931885024c8db8dae1", + "url": "https://api.github.com/repos/smalot/pdfparser/zipball/6b53144fcb24af77093d4150dd7d0dd571f25761", + "reference": "6b53144fcb24af77093d4150dd7d0dd571f25761", "shasum": "" }, "require": { @@ -11425,9 +11425,9 @@ ], "support": { "issues": "https://github.com/smalot/pdfparser/issues", - "source": "https://github.com/smalot/pdfparser/tree/v2.8.0" + "source": "https://github.com/smalot/pdfparser/tree/v2.9.0" }, - "time": "2023-12-01T11:13:56+00:00" + "time": "2024-03-01T09:51:10+00:00" }, { "name": "socialiteproviders/apple", @@ -11712,16 +11712,16 @@ }, { "name": "spatie/laravel-package-tools", - "version": "1.16.2", + "version": "1.16.3", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "e62eeb1fe8a8a0b2e83227a6c279c8c59f7d3a15" + "reference": "59db18c2e20d49a0b6d447bb1c654f6c123beb9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/e62eeb1fe8a8a0b2e83227a6c279c8c59f7d3a15", - "reference": "e62eeb1fe8a8a0b2e83227a6c279c8c59f7d3a15", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/59db18c2e20d49a0b6d447bb1c654f6c123beb9e", + "reference": "59db18c2e20d49a0b6d447bb1c654f6c123beb9e", "shasum": "" }, "require": { @@ -11760,7 +11760,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.2" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.3" }, "funding": [ { @@ -11768,7 +11768,7 @@ "type": "github" } ], - "time": "2024-01-11T08:43:00+00:00" + "time": "2024-03-07T07:35:57+00:00" }, { "name": "spatie/php-structure-discoverer", @@ -16261,16 +16261,16 @@ }, { "name": "composer/pcre", - "version": "3.1.1", + "version": "3.1.2", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" + "reference": "4775f35b2d70865807c89d32c8e7385b86eb0ace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", - "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "url": "https://api.github.com/repos/composer/pcre/zipball/4775f35b2d70865807c89d32c8e7385b86eb0ace", + "reference": "4775f35b2d70865807c89d32c8e7385b86eb0ace", "shasum": "" }, "require": { @@ -16312,7 +16312,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.1" + "source": "https://github.com/composer/pcre/tree/3.1.2" }, "funding": [ { @@ -16328,7 +16328,7 @@ "type": "tidelift" } ], - "time": "2023-10-11T07:11:09+00:00" + "time": "2024-03-07T15:38:35+00:00" }, { "name": "composer/semver", @@ -17425,16 +17425,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.59", + "version": "1.10.60", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "e607609388d3a6d418a50a49f7940e8086798281" + "reference": "95dcea7d6c628a3f2f56d091d8a0219485a86bbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e607609388d3a6d418a50a49f7940e8086798281", - "reference": "e607609388d3a6d418a50a49f7940e8086798281", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/95dcea7d6c628a3f2f56d091d8a0219485a86bbe", + "reference": "95dcea7d6c628a3f2f56d091d8a0219485a86bbe", "shasum": "" }, "require": { @@ -17483,7 +17483,7 @@ "type": "tidelift" } ], - "time": "2024-02-20T13:59:13+00:00" + "time": "2024-03-07T13:30:19+00:00" }, { "name": "phpunit/php-code-coverage", From 3d37cdde7bf85e00ea3cc4e2810a0fd5bdb46c40 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 8 Mar 2024 14:10:19 +1100 Subject: [PATCH 19/21] Helper test for payment settings --- lang/en/texts.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lang/en/texts.php b/lang/en/texts.php index 507dfdc76a88..518c47eaffe1 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -5241,7 +5241,16 @@ $lang = array( 'test_email_sent' => 'Successfully sent email', 'gateway_type' => 'Gateway Type', 'save_template_body' => 'Would you like to save this import mapping as a template for future use?', - 'save_as_template' => 'Save Template Mapping' + 'save_as_template' => 'Save Template Mapping', + 'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date', + 'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)', + 'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method', + 'use_unapplied_payments' => 'Use unapplied payments', + 'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method', + 'payment_terms_help' => 'The number of days after the invoice date that payment is due', + 'payment_type_help' => 'The default payment type to be used for payments', + 'quote_valid_until' => 'The number of days that the quote is valid for', + 'expense_payment_type' => 'The default expense payment type to be used', ); return $lang; From 0d4ad64314e6ad1f405d7e22380735c4f534a020 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 8 Mar 2024 15:02:11 +1100 Subject: [PATCH 20/21] Updated translations --- lang/ar/texts.php | 89 +++++++++++++------------ lang/de/texts.php | 153 ++++++++++++++++++++++--------------------- lang/es/texts.php | 71 ++++++++++---------- lang/es_ES/texts.php | 7 +- lang/fr/texts.php | 85 +++++++++++++----------- lang/fr_CA/texts.php | 1 + lang/fr_CH/texts.php | 83 ++++++++++++----------- lang/he/texts.php | 143 +++++++++++++++++++++------------------- lang/hu/texts.php | 133 +++++++++++++++++++------------------ lang/lo_LA/texts.php | 75 +++++++++++---------- lang/nl/texts.php | 141 ++++++++++++++++++++------------------- 11 files changed, 516 insertions(+), 465 deletions(-) diff --git a/lang/ar/texts.php b/lang/ar/texts.php index 1d97f0f5c811..6ed50ced938b 100644 --- a/lang/ar/texts.php +++ b/lang/ar/texts.php @@ -499,8 +499,8 @@ $lang = array( 'auto_wrap' => 'التفاف خط السيارات', 'duplicate_post' => 'تحذير: الصفحة السابقة قدمت مرتين. تم تجاهل التقديم الثاني.', 'view_documentation' => 'عرض التوثيق', - 'app_title' => 'Free Online Invoicing', - 'app_description' => 'Invoice Ninja is a free, open-code solution for invoicing and billing customers. With Invoice Ninja, you can easily build and send beautiful invoices from any device that has access to the web. Your clients can print your invoices, download them as pdf files, and even pay you online from within the system.', + 'app_title' => 'فواتير مجانية عبر الإنترنت', + 'app_description' => 'يعد Invoice Ninja حلاً مجانيًا مفتوح الرمز لإعداد الفواتير وإعداد الفواتير للعملاء. باستخدام Invoice Ninja، يمكنك بسهولة إنشاء وإرسال فواتير جميلة من أي جهاز لديه إمكانية الوصول إلى الويب. يمكن لعملائك طباعة فواتيرك، وتنزيلها كملفات pdf، وحتى الدفع لك عبر الإنترنت من داخل النظام.', 'rows' => 'صفوف', 'www' => 'www', 'logo' => 'شعار', @@ -686,9 +686,9 @@ $lang = array( 'disable' => 'إبطال', 'invoice_quote_number' => 'أرقام الفاتورة والاقتباس', 'invoice_charges' => 'رسوم الفاتورة الإضافية', - 'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.

:error', + 'notification_invoice_bounced' => 'لم نتمكن من تسليم الفاتورة :invoice إلى :contact .

:error', 'notification_invoice_bounced_subject' => 'تعذر تسليم الفاتورة :invoice', - 'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.

:error', + 'notification_quote_bounced' => 'لم نتمكن من تسليم عرض الأسعار :invoice إلى :contact .

:error', 'notification_quote_bounced_subject' => 'غير قادر على تسليم اقتباس :invoice', 'custom_invoice_link' => 'رابط الفاتورة المخصصة', 'total_invoiced' => 'إجمالي الفاتورة', @@ -2991,7 +2991,7 @@ $lang = array( 'hosted_login' => 'مستضاف تسجيل الدخول', 'selfhost_login' => 'تسجيل الدخول إلى Selfhost', 'google_login' => 'جوجل تسجيل الدخول', - 'thanks_for_patience' => 'Thank for your patience while we work to implement these features.

We hope to have them completed in the next few months.

Until then we\'ll continue to support the', + 'thanks_for_patience' => 'نشكرك على سعة صدرك بينما نعمل على تنفيذ هذه الميزات.

ونأمل أن يتم الانتهاء منها في الأشهر القليلة المقبلة.

وحتى ذلك الحين سنواصل دعمنا', 'legacy_mobile_app' => 'تطبيق جوال قديم', 'today' => 'اليوم', 'current' => 'حاضِر', @@ -3849,7 +3849,7 @@ $lang = array( 'cancellation_pending' => 'الإلغاء معلق ، سنكون على اتصال!', 'list_of_payments' => 'قائمة المدفوعات', 'payment_details' => 'تفاصيل الدفع', - 'list_of_payment_invoices' => 'Associate invoices', + 'list_of_payment_invoices' => 'الفواتير المرتبطة', 'list_of_payment_methods' => 'قائمة طرق الدفع', 'payment_method_details' => 'تفاصيل طريقة الدفع', 'permanently_remove_payment_method' => 'قم بإزالة طريقة الدفع هذه بشكل دائم.', @@ -4906,7 +4906,7 @@ $lang = array( 'no_assigned_tasks' => 'لا توجد مهام قابلة للفوترة لهذا المشروع', 'authorization_failure' => 'أذونات غير كافية لتنفيذ هذا الإجراء', 'authorization_sms_failure' => 'يرجى التحقق من حسابك لإرسال رسائل البريد الإلكتروني.', - 'white_label_body' => 'Thank you for purchasing a white label license.

Your license key is:

:license_key

You can manage your license here: https://invoiceninja.invoicing.co/client/login', + 'white_label_body' => 'شكرًا لك على شراء ترخيص العلامة البيضاء.

مفتاح الترخيص الخاص بك هو:

:license_key

يمكنك إدارة الترخيص الخاص بك هنا: https://invoiceninja.invoicing.co/client/login', 'payment_type_Klarna' => 'كلارنا', 'payment_type_Interac E Transfer' => 'Interac E Transfer', 'xinvoice_payable' => 'مستحق الدفع paydate: صافي أيام الدفع payeddue: تاريخ الدفع', @@ -5071,7 +5071,7 @@ $lang = array( 'region' => 'منطقة', 'county' => 'مقاطعة', 'tax_details' => 'التفاصيل الضريبية', - 'activity_10_online' => ':contact made payment :payment for invoice :invoice for :client', + 'activity_10_online' => ':contact تم الدفع :payment للفاتورة :invoice لـ :client', 'activity_10_manual' => ':user الدفعة المدخلة :payment للفاتورة :invoice لـ :client', 'default_payment_type' => 'نوع الدفع الافتراضي', 'number_precision' => 'دقة العدد', @@ -5101,7 +5101,7 @@ $lang = array( 'set_private' => 'تعيين خاص', 'individual' => 'فردي', 'business' => 'عمل', - 'partnership' => 'Partnership', + 'partnership' => 'شراكة', 'trust' => 'يثق', 'charity' => 'صدقة', 'government' => 'حكومة', @@ -5185,39 +5185,44 @@ $lang = array( 'nordigen_handler_error_contents_requisition_no_accounts' => 'لم تقم الخدمة بإرجاع أي حسابات صالحة. فكر في إعادة تشغيل التدفق.', 'nordigen_handler_restart' => 'إعادة تشغيل التدفق.', 'nordigen_handler_return' => 'العودة إلى التطبيق.', - 'lang_Lao' => 'Lao', - 'currency_lao_kip' => 'Lao kip', - 'yodlee_regions' => 'Regions: USA, UK, Australia & India', - 'nordigen_regions' => 'Regions: Europe & UK', - 'select_provider' => 'Select Provider', - 'nordigen_requisition_subject' => 'Requisition expired, please reauthenticate.', - 'nordigen_requisition_body' => 'Access to bank account feeds has expired as set in End User Agreement.

Please log into Invoice Ninja and re-authenticate with your banks to continue receiving transactions.', - 'participant' => 'Participant', - 'participant_name' => 'Participant name', - 'client_unsubscribed' => 'Client unsubscribed from emails.', - 'client_unsubscribed_help' => 'Client :client has unsubscribed from your e-mails. The client needs to consent to receive future emails from you.', - 'resubscribe' => 'Resubscribe', - 'subscribe' => 'Subscribe', - 'subscribe_help' => 'You are currently subscribed and will continue to receive email communications.', - 'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', - 'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact.

:error', - 'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', - 'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile', - 'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.', - 'please_select_an_invoice_or_credit' => 'Please select an invoice or credit', - 'mobile_version' => 'Mobile Version', - 'venmo' => 'Venmo', - 'my_bank' => 'MyBank', - 'pay_later' => 'Pay Later', - 'local_domain' => 'Local Domain', - 'verify_peer' => 'Verify Peer', - 'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key', - 'ar_detailed' => 'Accounts Receivable Detailed', - 'ar_summary' => 'Accounts Receivable Summary', - 'client_sales' => 'Client Sales', - 'user_sales' => 'User Sales', - 'iframe_url' => 'iFrame URL', - 'user_unsubscribed' => 'User unsubscribed from emails :link', + 'lang_Lao' => 'لاو', + 'currency_lao_kip' => 'لاو كيب', + 'yodlee_regions' => 'المناطق: الولايات المتحدة الأمريكية والمملكة المتحدة وأستراليا والهند', + 'nordigen_regions' => 'المناطق: أوروبا والمملكة المتحدة', + 'select_provider' => 'حدد الموفر', + 'nordigen_requisition_subject' => 'انتهت صلاحية الطلب، يرجى إعادة المصادقة.', + 'nordigen_requisition_body' => 'انتهت صلاحية الوصول إلى خلاصات حساب البنك كما هو محدد في اتفاقية المستخدم النهائي.

يرجى تسجيل الدخول إلى Invoice Ninja وإعادة المصادقة مع البنوك التي تتعامل معها لمواصلة تلقي المعاملات.', + 'participant' => 'مشارك', + 'participant_name' => 'اسم المشارك', + 'client_unsubscribed' => 'تم إلغاء اشتراك العميل من رسائل البريد الإلكتروني.', + 'client_unsubscribed_help' => 'لقد قام العميل :client بإلغاء اشتراكه في رسائل البريد الإلكتروني الخاصة بك. يحتاج العميل إلى الموافقة على تلقي رسائل البريد الإلكتروني المستقبلية منك.', + 'resubscribe' => 'إعادة الاشتراك', + 'subscribe' => 'يشترك', + 'subscribe_help' => 'أنت مشترك حاليًا وستستمر في تلقي اتصالات البريد الإلكتروني.', + 'unsubscribe_help' => 'أنت غير مشترك حاليًا، وبالتالي لن تتلقى رسائل بريد إلكتروني في الوقت الحالي.', + 'notification_purchase_order_bounced' => 'لم نتمكن من تسليم طلب الشراء :invoice إلى :contact .

:error', + 'notification_purchase_order_bounced_subject' => 'غير قادر على تسليم أمر الشراء :invoice', + 'show_pdfhtml_on_mobile' => 'عرض إصدار HTML للكيان عند العرض على الهاتف المحمول', + 'show_pdfhtml_on_mobile_help' => 'لتحسين التصور، يتم عرض نسخة HTML من الفاتورة/عرض الأسعار عند عرضها على الهاتف المحمول.', + 'please_select_an_invoice_or_credit' => 'الرجاء تحديد فاتورة أو رصيد', + 'mobile_version' => 'اصدار المحمول', + 'venmo' => 'فينمو', + 'my_bank' => 'بنكي', + 'pay_later' => 'ادفع لاحقا', + 'local_domain' => 'المجال المحلي', + 'verify_peer' => 'التحقق من النظير', + 'nordigen_help' => 'ملاحظة: يتطلب ربط حساب مفتاح GoCardless/Nordigen API', + 'ar_detailed' => 'حسابات القبض مفصلة', + 'ar_summary' => 'ملخص حسابات القبض', + 'client_sales' => 'مبيعات العملاء', + 'user_sales' => 'مبيعات المستخدم', + 'iframe_url' => 'عنوان URL لإطار iFrame', + 'user_unsubscribed' => 'تم إلغاء اشتراك المستخدم من رسائل البريد الإلكتروني :link', + 'use_available_payments' => 'استخدم المدفوعات المتاحة', + 'test_email_sent' => 'تم إرسال البريد الإلكتروني بنجاح', + 'gateway_type' => 'نوع البوابة', + 'save_template_body' => 'هل ترغب في حفظ تعيين الاستيراد هذا كقالب لاستخدامه في المستقبل؟', + 'save_as_template' => 'حفظ تعيين القالب' ); return $lang; diff --git a/lang/de/texts.php b/lang/de/texts.php index c08170ef7b81..2f055d0b222d 100644 --- a/lang/de/texts.php +++ b/lang/de/texts.php @@ -507,8 +507,8 @@ $lang = array( 'auto_wrap' => 'Automatischer Zeilenumbruch', 'duplicate_post' => 'Achtung: Die vorherige Seite wurde zweimal übermittelt. Die zweite Übermittlung wurde ignoriert.', 'view_documentation' => 'Dokumentation anzeigen', - 'app_title' => 'Free Online Invoicing', - 'app_description' => 'Invoice Ninja is a free, open-code solution for invoicing and billing customers. With Invoice Ninja, you can easily build and send beautiful invoices from any device that has access to the web. Your clients can print your invoices, download them as pdf files, and even pay you online from within the system.', + 'app_title' => 'Kostenlose Online-Rechnung', + 'app_description' => 'Invoice Ninja ist eine kostenlose Open-Code-Lösung für die Rechnungsstellung und Abrechnung mit Kunden. Mit Invoice Ninja können Sie ganz einfach schöne Rechnungen erstellen und versenden, von jedem Gerät aus, das Zugriff auf das Internet hat. Ihre Kunden können Ihre Rechnungen ausdrucken, als PDF-Dateien herunterladen und sogar online über das System bezahlen.', 'rows' => 'Zeilen', 'www' => 'www', 'logo' => 'Logo', @@ -1902,7 +1902,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'require_quote_signature_help' => 'Erfordern Sie die Unterschrift des Kunden bei Angeboten.', 'i_agree' => 'Ich stimme den Bedingungen zu', 'sign_here' => 'Bitte unterschreiben Sie hier:', - 'sign_here_ux_tip' => 'Use the mouse or your touchpad to trace your signature.', + 'sign_here_ux_tip' => 'Verwenden Sie die Maus oder Ihr Touchpad, um Ihre Signatur nachzuzeichnen.', 'authorization' => 'Genehmigung', 'signed' => 'unterzeichnet', @@ -3011,7 +3011,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'hosted_login' => 'Hosted Login', 'selfhost_login' => 'Selfhost Login', 'google_login' => 'Google Login', - 'thanks_for_patience' => 'Thank for your patience while we work to implement these features.

We hope to have them completed in the next few months.

Until then we\'ll continue to support the', + 'thanks_for_patience' => 'Vielen Dank für Ihre Geduld, während wir an der Implementierung dieser Funktionen arbeiten.

Wir hoffen, sie in den nächsten Monaten fertigstellen zu können.

Bis dahin unterstützen wir weiterhin die', 'legacy_mobile_app' => 'legacy Mobile App', 'today' => 'Heute', 'current' => 'Aktuell', @@ -3329,7 +3329,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'credit_number_counter' => 'Gutschriftnummernzähler', 'reset_counter_date' => 'Zählerdatum zurücksetzen', 'counter_padding' => 'Zähler-Innenabstand', - 'shared_invoice_quote_counter' => 'Share Invoice/Quote Counter', + 'shared_invoice_quote_counter' => 'Share Invoice/ Angebot / Kostenvoranschlag Counter', 'default_tax_name_1' => 'Standard-Steuername 1', 'default_tax_rate_1' => 'Standard-Steuersatz 1', 'default_tax_name_2' => 'Standard-Steuername 2', @@ -3870,7 +3870,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'cancellation_pending' => 'Kündigung in Bearbeitung! Wir melden uns bei Ihnen...', 'list_of_payments' => 'Liste der Zahlungen', 'payment_details' => 'Details zu der Zahlung', - 'list_of_payment_invoices' => 'Associate invoices', + 'list_of_payment_invoices' => 'Rechnungen zuordnen', 'list_of_payment_methods' => 'Liste der Zahlungsmethoden', 'payment_method_details' => 'Details zu der Zahlungsmethode', 'permanently_remove_payment_method' => 'Zahlungsmethode endgültig entfernen.', @@ -4219,7 +4219,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'direct_debit' => 'Lastschriftverfahren', 'clone_to_expense' => 'Klonen zu Ausgabe', 'checkout' => 'Kasse', - 'acss' => 'ACSS Debit', + 'acss' => 'ACSS-Lastschrift', 'invalid_amount' => 'Ungültiger Betrag. Nur Zahlen/Dezimalwerte.', 'client_payment_failure_body' => 'Zahlung für Rechnung :invoice for amount :amount fehlgeschlagen.', 'browser_pay' => 'Google Pay, Apple Pay, Microsoft Pay', @@ -4927,7 +4927,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'no_assigned_tasks' => 'Keine abzurechenden Aufgaben für diese Rechnung', 'authorization_failure' => 'Unzureichende Berechtigungen um diese Aktion auszuführen', 'authorization_sms_failure' => 'Bitte bestätigen Sie Ihr Konto um E-Mails zu versenden', - 'white_label_body' => 'Thank you for purchasing a white label license.

Your license key is:

:license_key

You can manage your license here: https://invoiceninja.invoicing.co/client/login', + 'white_label_body' => 'Vielen Dank, dass Sie eine White-Label-Lizenz erworben haben.

Ihr Lizenzschlüssel lautet:

:license_key

Sie können Ihre Lizenz hier verwalten: https://invoiceninja.invoicing.co/ Kunde /login', 'payment_type_Klarna' => 'Klarna', 'payment_type_Interac E Transfer' => 'Interac E-Übertragung', 'xinvoice_payable' => 'Zahlbar innerhalb von :payeddue Tagen netto bis :paydate', @@ -5092,7 +5092,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'region' => 'Region', 'county' => 'Landkreis', 'tax_details' => 'Steuerdetails', - 'activity_10_online' => ':contact made payment :payment for invoice :invoice for :client', + 'activity_10_online' => ':contact hat die Zahlung :payment für die Rechnung :invoice für :client geleistet', 'activity_10_manual' => ':user hat die Zahlung :payment für die Rechnung :invoice des Kunden :client eingegeben', 'default_payment_type' => 'Standard Zahlungsart', 'number_precision' => 'Genauigkeit der Nummern', @@ -5150,7 +5150,7 @@ Leistungsempfängers', 'payment_receipt' => 'Zahlungsbeleg #:number', 'load_template_description' => 'Das Template wird auf Folgendes angewendet:', 'run_template' => 'Template anwenden', - 'statement_design' => 'Statement Design', + 'statement_design' => 'Statement-Design', 'delivery_note_design' => 'Lieferschein Design', 'payment_receipt_design' => 'Zahlungsbeleg Design', 'payment_refund_design' => 'Gutschrift Design', @@ -5159,88 +5159,93 @@ Leistungsempfängers', 'view_extension' => 'Erweiterung ansehen', 'reactivate_email' => 'E-Mail reaktivieren', 'email_reactivated' => 'Email erfolgreich reaktiviert', - 'template_help' => 'Enable using the design as a template', + 'template_help' => 'Aktivieren Sie die Verwendung des Designs als Vorlage', 'quarter' => 'Quartal', - 'item_description' => 'Item Description', - 'task_item' => 'Task Item', - 'record_state' => 'Record State', - 'save_files_to_this_folder' => 'Save files to this folder', - 'downloads_folder' => 'Downloads Folder', - 'total_invoiced_quotes' => 'Invoiced Quotes', - 'total_invoice_paid_quotes' => 'Invoice Paid Quotes', - 'downloads_folder_does_not_exist' => 'The downloads folder does not exist :value', - 'user_logged_in_notification' => 'User Logged in Notification', - 'user_logged_in_notification_help' => 'Send an email when logging in from a new location', - 'payment_email_all_contacts' => 'Payment Email To All Contacts', - 'payment_email_all_contacts_help' => 'Sends the payment email to all contacts when enabled', + 'item_description' => 'Artikelbeschreibung', + 'task_item' => 'Aufgabe', + 'record_state' => 'Aufnahmestatus', + 'save_files_to_this_folder' => 'Speichern Sie Dateien in diesem Ordner', + 'downloads_folder' => 'Downloads-Ordner', + 'total_invoiced_quotes' => 'Angebote auf Rechnung', + 'total_invoice_paid_quotes' => 'Auf Rechnung bezahlte Angebote', + 'downloads_folder_does_not_exist' => 'Der Download-Ordner existiert nicht :value', + 'user_logged_in_notification' => 'Benachrichtigung über angemeldeten Benutzer', + 'user_logged_in_notification_help' => 'Senden Sie eine E-Mail, wenn Sie sich von einem neuen Standort aus anmelden', + 'payment_email_all_contacts' => 'Zahlungs-E-Mail an alle Kontakte', + 'payment_email_all_contacts_help' => 'Sendet die Zahlungs-E-Mail an alle Kontakte, wenn diese Option aktiviert ist', 'add_line' => 'Zeile hinzufügen', - 'activity_139' => 'Expense :expense notification sent to :contact', - 'vendor_notification_subject' => 'Confirmation of payment :amount sent to :vendor', - 'vendor_notification_body' => 'Payment processed for :amount dated :payment_date.
[Transaction Reference: :transaction_reference]', - 'receipt' => 'Receipt', - 'charges' => 'Charges', + 'activity_139' => 'Ausgabe :expense Benachrichtigung an :contact gesendet', + 'vendor_notification_subject' => 'Zahlungsbestätigung :amount gesendet an :vendor', + 'vendor_notification_body' => 'Zahlung für :amount vom :payment _date verarbeitet.
[Transaktionsreferenz: :transaction_reference ]', + 'receipt' => 'Quittung', + 'charges' => 'Gebühren', 'email_report' => 'E-Mail-Bericht', 'payment_type_Pay Later' => 'Später bezahlen', - 'payment_type_credit' => 'Payment Type Credit', - 'payment_type_debit' => 'Payment Type Debit', + 'payment_type_credit' => 'Zahlungsart Gutschrift', + 'payment_type_debit' => 'Zahlungsart Lastschrift', 'send_emails_to' => 'Sende E-Mails an', 'primary_contact' => 'Primärkontakt', 'all_contacts' => 'Alle Kontakte', 'insert_below' => 'Darunter einfügen', - 'nordigen_handler_subtitle' => 'Bank account authentication. Selecting your institution to complete the request with your account credentials.', + 'nordigen_handler_subtitle' => 'Authentifizierung des Bankkontos. Wählen Sie Ihre Institution aus, um die Anfrage mit Ihren Kontoanmeldeinformationen abzuschließen.', 'nordigen_handler_error_heading_unknown' => 'Ein Fehler ist aufgetreten', 'nordigen_handler_error_contents_unknown' => 'Ein unbekannter Fehler ist aufgetreten. Grund:', 'nordigen_handler_error_heading_token_invalid' => 'Ungültiges Token', - 'nordigen_handler_error_contents_token_invalid' => 'The provided token was invalid. Contact support for help, if this issue persists.', + 'nordigen_handler_error_contents_token_invalid' => 'Das bereitgestellte Token war ungültig. Wenn das Problem weiterhin besteht, wenden Sie sich an den Support.', 'nordigen_handler_error_heading_account_config_invalid' => 'Fehlende Zugangsdaten', - 'nordigen_handler_error_contents_account_config_invalid' => 'Invalid or missing credentials for Gocardless Bank Account Data. Contact support for help, if this issue persists.', + 'nordigen_handler_error_contents_account_config_invalid' => 'Ungültige oder fehlende Zugangsdaten für Gocardless Bankverbindung . Wenn das Problem weiterhin besteht, wenden Sie sich an den Support.', 'nordigen_handler_error_heading_not_available' => 'Nicht verfügbar', 'nordigen_handler_error_contents_not_available' => 'Funktion ist nur im Enterprise-Tarif verfügbar.', - 'nordigen_handler_error_heading_institution_invalid' => 'Invalid Institution', - 'nordigen_handler_error_contents_institution_invalid' => 'The provided institution-id is invalid or no longer valid.', + 'nordigen_handler_error_heading_institution_invalid' => 'Ungültige Institution', + 'nordigen_handler_error_contents_institution_invalid' => 'Die angegebene Institutions-ID ist ungültig oder nicht mehr gültig.', 'nordigen_handler_error_heading_ref_invalid' => 'Ungültige Referenz', - 'nordigen_handler_error_contents_ref_invalid' => 'GoCardless did not provide a valid reference. Please run flow again and contact support, if this issue persists.', - 'nordigen_handler_error_heading_not_found' => 'Invalid Requisition', - 'nordigen_handler_error_contents_not_found' => 'GoCardless did not provide a valid reference. Please run flow again and contact support, if this issue persists.', - 'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready', - 'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.', - 'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected', - 'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Considder restarting the flow.', - 'nordigen_handler_restart' => 'Restart flow.', - 'nordigen_handler_return' => 'Return to application.', - 'lang_Lao' => 'Lao', - 'currency_lao_kip' => 'Lao kip', - 'yodlee_regions' => 'Regions: USA, UK, Australia & India', - 'nordigen_regions' => 'Regions: Europe & UK', - 'select_provider' => 'Select Provider', - 'nordigen_requisition_subject' => 'Requisition expired, please reauthenticate.', - 'nordigen_requisition_body' => 'Access to bank account feeds has expired as set in End User Agreement.

Please log into Invoice Ninja and re-authenticate with your banks to continue receiving transactions.', - 'participant' => 'Participant', - 'participant_name' => 'Participant name', - 'client_unsubscribed' => 'Client unsubscribed from emails.', - 'client_unsubscribed_help' => 'Client :client has unsubscribed from your e-mails. The client needs to consent to receive future emails from you.', - 'resubscribe' => 'Resubscribe', - 'subscribe' => 'Subscribe', - 'subscribe_help' => 'You are currently subscribed and will continue to receive email communications.', - 'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', - 'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact.

:error', - 'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', - 'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile', - 'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.', - 'please_select_an_invoice_or_credit' => 'Please select an invoice or credit', + 'nordigen_handler_error_contents_ref_invalid' => 'GoCardless hat keine gültige Referenz angegeben. Bitte führen Sie Flow erneut aus und wenden Sie sich an den Support, wenn das Problem weiterhin besteht.', + 'nordigen_handler_error_heading_not_found' => 'Ungültige Anforderung', + 'nordigen_handler_error_contents_not_found' => 'GoCardless hat keine gültige Referenz angegeben. Bitte führen Sie Flow erneut aus und wenden Sie sich an den Support, wenn das Problem weiterhin besteht.', + 'nordigen_handler_error_heading_requisition_invalid_status' => 'Nicht bereit', + 'nordigen_handler_error_contents_requisition_invalid_status' => 'Sie haben diese Seite zu früh aufgerufen. Bitte schließen Sie die Autorisierung ab und aktualisieren Sie diese Seite. Wenn das Problem weiterhin besteht, wenden Sie sich an den Support.', + 'nordigen_handler_error_heading_requisition_no_accounts' => 'Keine Konten ausgewählt', + 'nordigen_handler_error_contents_requisition_no_accounts' => 'Der Dienst hat keine gültigen Konten zurückgegeben. Erwägen Sie, den Flow neu zu starten.', + 'nordigen_handler_restart' => 'Fluss neu starten.', + 'nordigen_handler_return' => 'Zurück zur Bewerbung.', + 'lang_Lao' => 'Laotisch', + 'currency_lao_kip' => 'Laotischer Kip', + 'yodlee_regions' => 'Regionen: USA, Großbritannien, Australien und Indien', + 'nordigen_regions' => 'Regionen: Europa und Großbritannien', + 'select_provider' => 'Wählen Sie Anbieter aus', + 'nordigen_requisition_subject' => 'Die Anforderung ist abgelaufen. Bitte authentifizieren Sie sich erneut.', + 'nordigen_requisition_body' => 'Der Zugriff auf Bankkonto-Feeds ist gemäß der Endbenutzervereinbarung abgelaufen.

Bitte melden Sie sich bei Invoice Ninja an und authentifizieren Sie sich erneut bei Ihren Banken, um weiterhin Transaktionen zu erhalten.', + 'participant' => 'Teilnehmer', + 'participant_name' => 'Teilnehmername', + 'client_unsubscribed' => 'Kunde hat sich von E-Mails abgemeldet.', + 'client_unsubscribed_help' => 'Kunde :client hat sich von Ihren E-Mails abgemeldet. Der Kunde muss zustimmen, künftige E-Mails von Ihnen zu erhalten.', + 'resubscribe' => 'Abonnieren Sie erneut', + 'subscribe' => 'Abonnieren', + 'subscribe_help' => 'Sie sind derzeit angemeldet und erhalten weiterhin E-Mail-Mitteilungen.', + 'unsubscribe_help' => 'Sie sind derzeit nicht abonniert und erhalten daher derzeit keine E-Mails.', + 'notification_purchase_order_bounced' => 'Wir konnten die Bestellung :invoice nicht an :contact liefern.

:error', + 'notification_purchase_order_bounced_subject' => 'Bestellung :invoice kann nicht geliefert werden', + 'show_pdfhtml_on_mobile' => 'Zeigt die HTML-Version der Entität an, wenn sie auf Mobilgeräten angezeigt wird', + 'show_pdfhtml_on_mobile_help' => 'Zur besseren Visualisierung wird bei der Anzeige auf Mobilgeräten eine HTML-Version der Rechnung/ Angebot / Kostenvoranschlag angezeigt.', + 'please_select_an_invoice_or_credit' => 'Bitte wählen Sie eine Rechnung oder Gutschrift aus', 'mobile_version' => 'Mobile Version', 'venmo' => 'Venmo', - 'my_bank' => 'MyBank', + 'my_bank' => 'Meine Bank', 'pay_later' => 'Später Zahlen', - 'local_domain' => 'Local Domain', - 'verify_peer' => 'Verify Peer', - 'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key', - 'ar_detailed' => 'Accounts Receivable Detailed', - 'ar_summary' => 'Accounts Receivable Summary', - 'client_sales' => 'Client Sales', - 'user_sales' => 'User Sales', - 'iframe_url' => 'iFrame URL', - 'user_unsubscribed' => 'User unsubscribed from emails :link', + 'local_domain' => 'Lokale Domäne', + 'verify_peer' => 'Peer überprüfen', + 'nordigen_help' => 'Hinweis: Für die Verbindung eines Kontos ist ein GoCardless/Nordigen-API-Schlüssel erforderlich', + 'ar_detailed' => 'Detaillierte Debitorenbuchhaltung', + 'ar_summary' => 'Zusammenfassung der Debitorenbuchhaltung', + 'client_sales' => 'Kunde', + 'user_sales' => 'Benutzerverkäufe', + 'iframe_url' => 'iFrame-URL', + 'user_unsubscribed' => 'Der Benutzer hat die E-Mails :link abgemeldet', + 'use_available_payments' => 'Verwenden Sie verfügbare Zahlungen', + 'test_email_sent' => 'E-Mail erfolgreich gesendet', + 'gateway_type' => 'Gateway-Typ', + 'save_template_body' => 'Möchten Sie diese Importzuordnung als Vorlage für die zukünftige Verwendung speichern?', + 'save_as_template' => 'Vorlagenzuordnung speichern' ); return $lang; diff --git a/lang/es/texts.php b/lang/es/texts.php index b8822da7f21c..010c2bb8dd66 100644 --- a/lang/es/texts.php +++ b/lang/es/texts.php @@ -506,8 +506,8 @@ $lang = array( 'auto_wrap' => 'Ajuste Automático de Línea', 'duplicate_post' => 'Advertencia: la página anterior fue enviada dos veces. El segundo envío ha sido ignorado.', 'view_documentation' => 'Ver Documentación', - 'app_title' => 'Free Online Invoicing', - 'app_description' => 'Invoice Ninja is a free, open-code solution for invoicing and billing customers. With Invoice Ninja, you can easily build and send beautiful invoices from any device that has access to the web. Your clients can print your invoices, download them as pdf files, and even pay you online from within the system.', + 'app_title' => 'Facturación en línea gratuita', + 'app_description' => 'Invoice Ninja es una solución gratuita de código abierto para facturar y facturar a los clientes. Con Invoice Ninja, puedes crear y enviar fácilmente hermosas facturas desde cualquier dispositivo que tenga acceso a la web. Sus clientes pueden imprimir sus facturas, descargarlas como archivos pdf e incluso pagarle en línea desde el sistema.', 'rows' => 'filas', 'www' => 'www', 'logo' => 'Logo', @@ -693,9 +693,9 @@ $lang = array( 'disable' => 'Deshabilitado', 'invoice_quote_number' => 'Números de Cotización y Factura', 'invoice_charges' => 'Cargos de Factura', - 'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.

:error', + 'notification_invoice_bounced' => 'No pudimos entregar la factura :invoice a :contact .

:error', 'notification_invoice_bounced_subject' => 'No fue posible entregar la Factura :invoice', - 'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.

:error', + 'notification_quote_bounced' => 'No pudimos entregar la cotización :invoice a :contact .

:error', 'notification_quote_bounced_subject' => 'No nos fue posible entregar la Cotización :invoice', 'custom_invoice_link' => 'Link Personalizado de Factura', 'total_invoiced' => 'Total Facturado', @@ -3009,7 +3009,7 @@ $lang = array( 'hosted_login' => 'Inicio de sesión alojado', 'selfhost_login' => 'Iniciar sesión', 'google_login' => 'Inicio de sesión de Google', - 'thanks_for_patience' => 'Thank for your patience while we work to implement these features.

We hope to have them completed in the next few months.

Until then we\'ll continue to support the', + 'thanks_for_patience' => 'Gracias por su paciencia mientras trabajamos para implementar estas funciones.

Esperamos tenerlos terminados en los próximos meses.

Hasta entonces seguiremos apoyando a la', 'legacy_mobile_app' => 'aplicación móvil heredada', 'today' => 'Hoy', 'current' => 'Actual', @@ -3867,7 +3867,7 @@ $lang = array( 'cancellation_pending' => 'Cancelación pendiente, ¡nos pondremos en contacto!', 'list_of_payments' => 'Lista de pagos', 'payment_details' => 'Detalles del pago', - 'list_of_payment_invoices' => 'Associate invoices', + 'list_of_payment_invoices' => 'Facturas asociadas', 'list_of_payment_methods' => 'Lista de métodos de pago', 'payment_method_details' => 'Detalles del método de pago', 'permanently_remove_payment_method' => 'Eliminar permanentemente este método de pago.', @@ -4924,7 +4924,7 @@ $lang = array( 'no_assigned_tasks' => 'No hay tareas facturables para este proyecto', 'authorization_failure' => 'Permisos insuficientes para realizar esta acción', 'authorization_sms_failure' => 'Por favor verifique su cuenta para enviar correos electrónicos.', - 'white_label_body' => 'Thank you for purchasing a white label license.

Your license key is:

:license_key

You can manage your license here: https://invoiceninja.invoicing.co/client/login', + 'white_label_body' => 'Gracias por adquirir una licencia de marca blanca.

Su clave de licencia es:

:license_key

Puedes gestionar tu licencia aquí: https://invoiceninja.invoicing.co/client/login', 'payment_type_Klarna' => 'Klarna', 'payment_type_Interac E Transfer' => 'Transferencia Interac E', 'xinvoice_payable' => 'Payable within :payeddue days net until :paydate', @@ -5119,7 +5119,7 @@ $lang = array( 'set_private' => 'Establecer privado', 'individual' => 'Individual', 'business' => 'Negocio', - 'partnership' => 'Partnership', + 'partnership' => 'Camaradería', 'trust' => 'Confianza', 'charity' => 'Caridad', 'government' => 'Gobierno', @@ -5210,32 +5210,37 @@ $lang = array( 'select_provider' => 'Seleccionar Proveedor', 'nordigen_requisition_subject' => 'La solicitud expiró, vuelva a autenticarse.', 'nordigen_requisition_body' => 'El acceso a los feeds de cuentas bancarias ha caducado según lo establecido en el Acuerdo de usuario final.

Inicie sesión en Invoice Ninja y vuelva a autenticarse con sus bancos para continuar recibiendo transacciones.', - 'participant' => 'Participant', - 'participant_name' => 'Participant name', - 'client_unsubscribed' => 'Client unsubscribed from emails.', - 'client_unsubscribed_help' => 'Client :client has unsubscribed from your e-mails. The client needs to consent to receive future emails from you.', - 'resubscribe' => 'Resubscribe', - 'subscribe' => 'Subscribe', - 'subscribe_help' => 'You are currently subscribed and will continue to receive email communications.', - 'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', - 'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact.

:error', - 'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', - 'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile', - 'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.', - 'please_select_an_invoice_or_credit' => 'Please select an invoice or credit', - 'mobile_version' => 'Mobile Version', + 'participant' => 'Partícipe', + 'participant_name' => 'Nombre del participante', + 'client_unsubscribed' => 'El cliente se dio de baja de los correos electrónicos.', + 'client_unsubscribed_help' => 'El cliente :client se ha dado de baja de sus correos electrónicos. El cliente debe dar su consentimiento para recibir futuros correos electrónicos suyos.', + 'resubscribe' => 'Volver a suscribirse', + 'subscribe' => 'Suscribir', + 'subscribe_help' => 'Actualmente está suscrito y seguirá recibiendo comunicaciones por correo electrónico.', + 'unsubscribe_help' => 'Actualmente no estás suscrito y, por lo tanto, no recibirás correos electrónicos en este momento.', + 'notification_purchase_order_bounced' => 'No pudimos entregar la orden de compra :invoice a :contact .

:error', + 'notification_purchase_order_bounced_subject' => 'No se puede entregar la orden de compra :invoice', + 'show_pdfhtml_on_mobile' => 'Mostrar la versión HTML de la entidad cuando se visualiza en un dispositivo móvil', + 'show_pdfhtml_on_mobile_help' => 'Para una visualización mejorada, muestra una versión HTML de la factura/cotización cuando se visualiza en el dispositivo móvil.', + 'please_select_an_invoice_or_credit' => 'Por favor seleccione una factura o crédito', + 'mobile_version' => 'Version móvil', 'venmo' => 'Venmo', - 'my_bank' => 'MyBank', - 'pay_later' => 'Pay Later', - 'local_domain' => 'Local Domain', - 'verify_peer' => 'Verify Peer', - 'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key', - 'ar_detailed' => 'Accounts Receivable Detailed', - 'ar_summary' => 'Accounts Receivable Summary', - 'client_sales' => 'Client Sales', - 'user_sales' => 'User Sales', - 'iframe_url' => 'iFrame URL', - 'user_unsubscribed' => 'User unsubscribed from emails :link', + 'my_bank' => 'Mi banco', + 'pay_later' => 'Paga después', + 'local_domain' => 'Dominio local', + 'verify_peer' => 'Verificar par', + 'nordigen_help' => 'Nota: conectar una cuenta requiere una clave API de GoCardless/Nordigen', + 'ar_detailed' => 'Cuentas por cobrar detalladas', + 'ar_summary' => 'Resumen de cuentas por cobrar', + 'client_sales' => 'Ventas al cliente', + 'user_sales' => 'Ventas de usuarios', + 'iframe_url' => 'URL del marco flotante', + 'user_unsubscribed' => 'Usuario dado de baja de los correos electrónicos :link', + 'use_available_payments' => 'Usar pagos disponibles', + 'test_email_sent' => 'Correo electrónico enviado correctamente', + 'gateway_type' => 'Tipo de puerta de enlace', + 'save_template_body' => '¿Le gustaría guardar este mapeo de importación como plantilla para uso futuro?', + 'save_as_template' => 'Guardar asignación de plantilla' ); return $lang; diff --git a/lang/es_ES/texts.php b/lang/es_ES/texts.php index 91fd1c22fa63..bb6228522af3 100644 --- a/lang/es_ES/texts.php +++ b/lang/es_ES/texts.php @@ -4921,7 +4921,7 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c 'no_assigned_tasks' => 'No hay tareas facturables para este proyecto', 'authorization_failure' => 'Permisos insuficientes para realizar esta acción', 'authorization_sms_failure' => 'Por favor verifique su cuenta para enviar correos electrónicos.', - 'white_label_body' => 'Thank you for purchasing a white label license.

Your license key is:

:license_key

You can manage your license here: https://invoiceninja.invoicing.co/client/login', + 'white_label_body' => 'Gracias por adquirir una licencia de marca blanca.

Su clave de licencia es:

:license_key

Puedes gestionar tu licencia aquí: https://invoiceninja.invoicing.co/client/login', 'payment_type_Klarna' => 'Klarna', 'payment_type_Interac E Transfer' => 'Interac E Transfer', 'xinvoice_payable' => 'Pagadero dentro de :payeddue días de pago vencido neto hasta :paydate', @@ -5234,6 +5234,11 @@ De lo contrario, este campo deberá dejarse en blanco.', 'user_sales' => 'Ventas de usuarios', 'iframe_url' => 'iFrame URL', 'user_unsubscribed' => 'Usuario dado de baja de los correos electrónicos :link', + 'use_available_payments' => 'Usar pagos disponibles', + 'test_email_sent' => 'Correo electrónico enviado correctamente', + 'gateway_type' => 'Tipo de puerta de enlace', + 'save_template_body' => '¿Le gustaría guardar este mapeo de importación como plantilla para uso futuro?', + 'save_as_template' => 'Guardar asignación de plantilla' ); return $lang; diff --git a/lang/fr/texts.php b/lang/fr/texts.php index f5fccd2ec5f2..177f2ff162e3 100644 --- a/lang/fr/texts.php +++ b/lang/fr/texts.php @@ -506,8 +506,8 @@ $lang = array( 'auto_wrap' => 'Retour à la ligne automatique', 'duplicate_post' => 'Attention: la page précédente a été soumise deux fois. La deuxième soumission a été ignorée.', 'view_documentation' => 'Voir documentation', - 'app_title' => 'Free Online Invoicing', - 'app_description' => 'Invoice Ninja is a free, open-code solution for invoicing and billing customers. With Invoice Ninja, you can easily build and send beautiful invoices from any device that has access to the web. Your clients can print your invoices, download them as pdf files, and even pay you online from within the system.', + 'app_title' => 'Facturation en ligne gratuite', + 'app_description' => 'Invoice Ninja est une solution gratuite et à code ouvert pour la facturation et la facturation des clients. Avec Invoice Ninja, vous pouvez facilement créer et envoyer de belles factures depuis n'importe quel appareil ayant accès au Web. Vos clients peuvent imprimer vos factures, les télécharger sous forme de fichiers PDF et même vous payer en ligne depuis le système.', 'rows' => 'lignes', 'www' => 'www', 'logo' => 'Logo', @@ -693,9 +693,9 @@ $lang = array( 'disable' => 'Désactiver', 'invoice_quote_number' => 'Numéro des devis & factures', 'invoice_charges' => 'Majoration de facture', - 'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.

:error', + 'notification_invoice_bounced' => 'Nous n'avons pas pu transmettre la facture :invoice à :contact .

:error', 'notification_invoice_bounced_subject' => 'Impossible d\'envoyer la facture :invoice', - 'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.

:error', + 'notification_quote_bounced' => 'Nous n'avons pas pu transmettre le devis :invoice à :contact .

:error', 'notification_quote_bounced_subject' => 'Impossible d\'envoyer le devis :invoice', 'custom_invoice_link' => 'Personnaliser le lien de la facture', 'total_invoiced' => 'Total facturé', @@ -3010,7 +3010,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'hosted_login' => 'Authentification Hosted', 'selfhost_login' => 'Authentification Selfhost', 'google_login' => 'Authentification Google', - 'thanks_for_patience' => 'Thank for your patience while we work to implement these features.

We hope to have them completed in the next few months.

Until then we\'ll continue to support the', + 'thanks_for_patience' => 'Merci de votre patience pendant que nous travaillons à la mise en œuvre de ces fonctionnalités.

Nous espérons les terminer dans les prochains mois.

D'ici là, nous continuerons à soutenir le', 'legacy_mobile_app' => 'Ancienne App mobile', 'today' => 'Aujourd\'hui', 'current' => 'Actuel', @@ -3868,7 +3868,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'cancellation_pending' => 'Annulation en cours, nous vous contacterons !', 'list_of_payments' => 'Liste des paiements', 'payment_details' => 'Détails du paiement', - 'list_of_payment_invoices' => 'Associate invoices', + 'list_of_payment_invoices' => 'Factures associées', 'list_of_payment_methods' => 'Liste des moyens de paiement', 'payment_method_details' => 'Détails du mode de paiement', 'permanently_remove_payment_method' => 'Supprimer définitivement ce mode de paiement.', @@ -4925,7 +4925,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'no_assigned_tasks' => 'Aucune tâche facturable pour ce projet', 'authorization_failure' => 'Autorisations insuffisantes pour effectuer cette action', 'authorization_sms_failure' => 'Veuillez vérifier votre compte pour envoyer des e-mails.', - 'white_label_body' => 'Thank you for purchasing a white label license.

Your license key is:

:license_key

You can manage your license here: https://invoiceninja.invoicing.co/client/login', + 'white_label_body' => 'Merci d'avoir acheté une licence en marque blanche.

Votre clé de licence est :

:license_key

Vous pouvez gérer votre licence ici : https://invoiceninja.invoicing.co/client/login', 'payment_type_Klarna' => 'Klarna', 'payment_type_Interac E Transfer' => 'Virement Interac E', 'xinvoice_payable' => 'Payable sous :payeddue days net jusqu\'au :paydate', @@ -5090,7 +5090,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'region' => 'Région', 'county' => 'Comté', 'tax_details' => 'Détails fiscaux', - 'activity_10_online' => ':contact made payment :payment for invoice :invoice for :client', + 'activity_10_online' => ':contact a effectué le paiement :payment pour la facture :invoice pour :client', 'activity_10_manual' => ':user a saisi le paiement :payment pour la facture :invoice pour :client', 'default_payment_type' => 'Type de paiement par défaut', 'number_precision' => 'Précision du nombre', @@ -5120,7 +5120,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'set_private' => 'Définir comme privé', 'individual' => 'Individuel', 'business' => 'Entreprise', - 'partnership' => 'Partnership', + 'partnership' => 'Partenariat', 'trust' => 'Confiance', 'charity' => 'Charité', 'government' => 'Gouvernement', @@ -5204,39 +5204,44 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'nordigen_handler_error_contents_requisition_no_accounts' => 'Le service n'a renvoyé aucun compte valide. Pensez à redémarrer le flux.', 'nordigen_handler_restart' => 'Redémarrez le flux.', 'nordigen_handler_return' => 'Retour à la candidature.', - 'lang_Lao' => 'Lao', - 'currency_lao_kip' => 'Lao kip', - 'yodlee_regions' => 'Regions: USA, UK, Australia & India', - 'nordigen_regions' => 'Regions: Europe & UK', - 'select_provider' => 'Select Provider', - 'nordigen_requisition_subject' => 'Requisition expired, please reauthenticate.', - 'nordigen_requisition_body' => 'Access to bank account feeds has expired as set in End User Agreement.

Please log into Invoice Ninja and re-authenticate with your banks to continue receiving transactions.', + 'lang_Lao' => 'Laotien', + 'currency_lao_kip' => 'Kip laotien', + 'yodlee_regions' => 'Régions : États-Unis, Royaume-Uni, Australie et Inde', + 'nordigen_regions' => 'Régions : Europe et Royaume-Uni', + 'select_provider' => 'Sélectionnez le fournisseur', + 'nordigen_requisition_subject' => 'La demande a expiré, veuillez vous authentifier à nouveau.', + 'nordigen_requisition_body' => 'L'accès aux flux des comptes bancaires a expiré comme indiqué dans le Contrat de l'utilisateur final.

Veuillez vous connecter à Invoice Ninja et vous authentifier à nouveau auprès de vos banques pour continuer à recevoir des transactions.', 'participant' => 'Participant', - 'participant_name' => 'Participant name', - 'client_unsubscribed' => 'Client unsubscribed from emails.', - 'client_unsubscribed_help' => 'Client :client has unsubscribed from your e-mails. The client needs to consent to receive future emails from you.', - 'resubscribe' => 'Resubscribe', - 'subscribe' => 'Subscribe', - 'subscribe_help' => 'You are currently subscribed and will continue to receive email communications.', - 'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', - 'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact.

:error', - 'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', - 'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile', - 'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.', - 'please_select_an_invoice_or_credit' => 'Please select an invoice or credit', - 'mobile_version' => 'Mobile Version', + 'participant_name' => 'Nom du participant', + 'client_unsubscribed' => 'Client désabonné des e-mails.', + 'client_unsubscribed_help' => 'Le client :client s'est désabonné de vos e-mails. Le client doit consentir à recevoir de futurs e-mails de votre part.', + 'resubscribe' => 'Réabonnez-vous', + 'subscribe' => 'S'abonner', + 'subscribe_help' => 'Vous êtes actuellement abonné et continuerez à recevoir des communications par courrier électronique.', + 'unsubscribe_help' => 'Vous n'êtes actuellement pas abonné et ne recevrez donc pas d'e-mails pour le moment.', + 'notification_purchase_order_bounced' => 'Nous n'avons pas pu livrer le bon de commande :invoice à :contact .

:error', + 'notification_purchase_order_bounced_subject' => 'Impossible de livrer le bon de commande :invoice', + 'show_pdfhtml_on_mobile' => 'Afficher la version HTML de l'entité lors de la visualisation sur mobile', + 'show_pdfhtml_on_mobile_help' => 'Pour une visualisation améliorée, affiche une version HTML de la facture/devis lors de la visualisation sur mobile.', + 'please_select_an_invoice_or_credit' => 'Veuillez sélectionner une facture ou un crédit', + 'mobile_version' => 'Version mobile', 'venmo' => 'Venmo', - 'my_bank' => 'MyBank', - 'pay_later' => 'Pay Later', - 'local_domain' => 'Local Domain', - 'verify_peer' => 'Verify Peer', - 'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key', - 'ar_detailed' => 'Accounts Receivable Detailed', - 'ar_summary' => 'Accounts Receivable Summary', - 'client_sales' => 'Client Sales', - 'user_sales' => 'User Sales', - 'iframe_url' => 'iFrame URL', - 'user_unsubscribed' => 'User unsubscribed from emails :link', + 'my_bank' => 'Ma banque', + 'pay_later' => 'Payer plus tard', + 'local_domain' => 'Domaine local', + 'verify_peer' => 'Vérifier le pair', + 'nordigen_help' => 'Remarque : la connexion d'un compte nécessite une clé API GoCardless/Nordigen', + 'ar_detailed' => 'Comptes clients détaillés', + 'ar_summary' => 'Sommaire des comptes clients', + 'client_sales' => 'Ventes clients', + 'user_sales' => 'Ventes aux utilisateurs', + 'iframe_url' => 'URL iFrame', + 'user_unsubscribed' => 'Utilisateur désabonné des e-mails :link', + 'use_available_payments' => 'Utiliser les paiements disponibles', + 'test_email_sent' => 'E-mail envoyé avec succès', + 'gateway_type' => 'Type de passerelle', + 'save_template_body' => 'Souhaitez-vous enregistrer ce mappage d’importation en tant que modèle pour une utilisation future ?', + 'save_as_template' => 'Enregistrer le mappage de modèle' ); return $lang; diff --git a/lang/fr_CA/texts.php b/lang/fr_CA/texts.php index 497ed891308a..64d80216948c 100644 --- a/lang/fr_CA/texts.php +++ b/lang/fr_CA/texts.php @@ -5238,6 +5238,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'test_email_sent' => 'Le courriel a été envoyé', 'gateway_type' => 'Type de passerelle', 'save_template_body' => 'Souhaitez-vous enregistrer cette correspondance d\'importation en tant que modèle pour une utilisation future ?', + 'save_as_template' => 'Enregistrer la correspondance de modèle' ); return $lang; diff --git a/lang/fr_CH/texts.php b/lang/fr_CH/texts.php index 03716645652f..ead25b634ea3 100644 --- a/lang/fr_CH/texts.php +++ b/lang/fr_CH/texts.php @@ -506,8 +506,8 @@ $lang = array( 'auto_wrap' => 'Retour à la ligne automatique', 'duplicate_post' => 'Avertissement: la page précédente a été envoyée deux fois. Le deuxième envoi a été ignoré.', 'view_documentation' => 'Voir la documentation', - 'app_title' => 'Free Online Invoicing', - 'app_description' => 'Invoice Ninja is a free, open-code solution for invoicing and billing customers. With Invoice Ninja, you can easily build and send beautiful invoices from any device that has access to the web. Your clients can print your invoices, download them as pdf files, and even pay you online from within the system.', + 'app_title' => 'Facturation en ligne gratuite', + 'app_description' => 'Invoice Ninja est une solution gratuite et à code ouvert pour la facturation et la facturation des clients. Avec Invoice Ninja, vous pouvez facilement créer et envoyer de belles factures depuis n'importe quel appareil ayant accès au Web. Vos clients peuvent imprimer vos factures, les télécharger sous forme de fichiers PDF et même vous payer en ligne depuis le système.', 'rows' => 'lignes', 'www' => 'www', 'logo' => 'Logo', @@ -693,9 +693,9 @@ $lang = array( 'disable' => 'Désactiver', 'invoice_quote_number' => 'Numéro des offres & factures', 'invoice_charges' => 'Suppléments de facture', - 'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.

:error', + 'notification_invoice_bounced' => 'Nous n'avons pas pu transmettre la facture :invoice à :contact .

:error', 'notification_invoice_bounced_subject' => 'Impossible d\'envoyer la facture :invoice', - 'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.

:error', + 'notification_quote_bounced' => 'Nous n'avons pas pu transmettre le devis :invoice à :contact .

:error', 'notification_quote_bounced_subject' => 'Impossible d\'envoyer l\'offre :invoice', 'custom_invoice_link' => 'Lien de facture personnalisé', 'total_invoiced' => 'Total facturé', @@ -3007,7 +3007,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'hosted_login' => 'Connexion hébergée', 'selfhost_login' => 'Connexion autohébergée', 'google_login' => 'Connexion Google', - 'thanks_for_patience' => 'Thank for your patience while we work to implement these features.

We hope to have them completed in the next few months.

Until then we\'ll continue to support the', + 'thanks_for_patience' => 'Merci de votre patience pendant que nous travaillons à la mise en œuvre de ces fonctionnalités.

Nous espérons les terminer dans les prochains mois.

D'ici là, nous continuerons à soutenir le', 'legacy_mobile_app' => 'Ancienne App mobile', 'today' => 'Aujourd\'hui', 'current' => 'En cours', @@ -3865,7 +3865,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'cancellation_pending' => 'Annulation en attente. Nous vous tiendrons au courant.', 'list_of_payments' => 'Liste des paiements', 'payment_details' => 'Détails du paiement', - 'list_of_payment_invoices' => 'Associate invoices', + 'list_of_payment_invoices' => 'Factures associées', 'list_of_payment_methods' => 'Liste des modes de paiement', 'payment_method_details' => 'Détails du mode de paiement', 'permanently_remove_payment_method' => 'Supprimer de façon définitive ce mode de paiement', @@ -4922,7 +4922,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'no_assigned_tasks' => 'Aucune intervetion facturable pour ce projet', 'authorization_failure' => 'Insufficient permissions to perform this action', 'authorization_sms_failure' => 'Please verify your account to send emails.', - 'white_label_body' => 'Thank you for purchasing a white label license.

Your license key is:

:license_key

You can manage your license here: https://invoiceninja.invoicing.co/client/login', + 'white_label_body' => 'Merci d'avoir acheté une licence en marque blanche.

Votre clé de licence est :

:license_key

Vous pouvez gérer votre licence ici : https://invoiceninja.invoicing.co/client/login', 'payment_type_Klarna' => 'Klarna', 'payment_type_Interac E Transfer' => 'Interac E Transfer', 'xinvoice_payable' => 'Payable sous :payeddue jours net jusqu'à :paydate', @@ -5117,7 +5117,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'set_private' => 'Définir comme privé', 'individual' => 'Individuel', 'business' => 'Entreprise', - 'partnership' => 'Partnership', + 'partnership' => 'Partenariat', 'trust' => 'Confiance', 'charity' => 'Charité', 'government' => 'Gouvernement', @@ -5201,39 +5201,44 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'nordigen_handler_error_contents_requisition_no_accounts' => 'Le service n'a renvoyé aucun compte valide. Pensez à redémarrer le flux.', 'nordigen_handler_restart' => 'Redémarrez le flux.', 'nordigen_handler_return' => 'Retour à la candidature.', - 'lang_Lao' => 'Lao', - 'currency_lao_kip' => 'Lao kip', - 'yodlee_regions' => 'Regions: USA, UK, Australia & India', - 'nordigen_regions' => 'Regions: Europe & UK', - 'select_provider' => 'Select Provider', - 'nordigen_requisition_subject' => 'Requisition expired, please reauthenticate.', - 'nordigen_requisition_body' => 'Access to bank account feeds has expired as set in End User Agreement.

Please log into Invoice Ninja and re-authenticate with your banks to continue receiving transactions.', + 'lang_Lao' => 'Laotien', + 'currency_lao_kip' => 'Kip laotien', + 'yodlee_regions' => 'Régions : États-Unis, Royaume-Uni, Australie et Inde', + 'nordigen_regions' => 'Régions : Europe et Royaume-Uni', + 'select_provider' => 'Sélectionnez le fournisseur', + 'nordigen_requisition_subject' => 'La demande a expiré, veuillez vous authentifier à nouveau.', + 'nordigen_requisition_body' => 'L'accès aux flux des comptes bancaires a expiré comme indiqué dans le Contrat de l'utilisateur final.

Veuillez vous connecter à Invoice Ninja et vous authentifier à nouveau auprès de vos banques pour continuer à recevoir des transactions.', 'participant' => 'Participant', - 'participant_name' => 'Participant name', - 'client_unsubscribed' => 'Client unsubscribed from emails.', - 'client_unsubscribed_help' => 'Client :client has unsubscribed from your e-mails. The client needs to consent to receive future emails from you.', - 'resubscribe' => 'Resubscribe', - 'subscribe' => 'Subscribe', - 'subscribe_help' => 'You are currently subscribed and will continue to receive email communications.', - 'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', - 'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact.

:error', - 'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', - 'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile', - 'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.', - 'please_select_an_invoice_or_credit' => 'Please select an invoice or credit', - 'mobile_version' => 'Mobile Version', + 'participant_name' => 'Nom du participant', + 'client_unsubscribed' => 'Client désabonné des e-mails.', + 'client_unsubscribed_help' => 'Le client :client s'est désabonné de vos e-mails. Le client doit consentir à recevoir de futurs e-mails de votre part.', + 'resubscribe' => 'Réabonnez-vous', + 'subscribe' => 'S'abonner', + 'subscribe_help' => 'Vous êtes actuellement abonné et continuerez à recevoir des communications par courrier électronique.', + 'unsubscribe_help' => 'Vous n'êtes actuellement pas abonné et ne recevrez donc pas d'e-mails pour le moment.', + 'notification_purchase_order_bounced' => 'Nous n'avons pas pu livrer le bon de commande :invoice à :contact .

:error', + 'notification_purchase_order_bounced_subject' => 'Impossible de livrer le bon de commande :invoice', + 'show_pdfhtml_on_mobile' => 'Afficher la version HTML de l'entité lors de la visualisation sur mobile', + 'show_pdfhtml_on_mobile_help' => 'Pour une visualisation améliorée, affiche une version HTML de la facture/devis lors de la visualisation sur mobile.', + 'please_select_an_invoice_or_credit' => 'Veuillez sélectionner une facture ou un crédit', + 'mobile_version' => 'Version mobile', 'venmo' => 'Venmo', - 'my_bank' => 'MyBank', - 'pay_later' => 'Pay Later', - 'local_domain' => 'Local Domain', - 'verify_peer' => 'Verify Peer', - 'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key', - 'ar_detailed' => 'Accounts Receivable Detailed', - 'ar_summary' => 'Accounts Receivable Summary', - 'client_sales' => 'Client Sales', - 'user_sales' => 'User Sales', - 'iframe_url' => 'iFrame URL', - 'user_unsubscribed' => 'User unsubscribed from emails :link', + 'my_bank' => 'Ma banque', + 'pay_later' => 'Payer plus tard', + 'local_domain' => 'Domaine local', + 'verify_peer' => 'Vérifier le pair', + 'nordigen_help' => 'Remarque : la connexion d'un compte nécessite une clé API GoCardless/Nordigen', + 'ar_detailed' => 'Comptes clients détaillés', + 'ar_summary' => 'Sommaire des comptes clients', + 'client_sales' => 'Ventes clients', + 'user_sales' => 'Ventes aux utilisateurs', + 'iframe_url' => 'URL iFrame', + 'user_unsubscribed' => 'Utilisateur désabonné des e-mails :link', + 'use_available_payments' => 'Utiliser les paiements disponibles', + 'test_email_sent' => 'E-mail envoyé avec succès', + 'gateway_type' => 'Type de passerelle', + 'save_template_body' => 'Souhaitez-vous enregistrer ce mappage d’importation en tant que modèle pour une utilisation future ?', + 'save_as_template' => 'Enregistrer le mappage de modèle' ); return $lang; diff --git a/lang/he/texts.php b/lang/he/texts.php index 52658c6495de..2ed88859dd69 100644 --- a/lang/he/texts.php +++ b/lang/he/texts.php @@ -504,8 +504,8 @@ $lang = array( 'auto_wrap' => 'Auto Line Wrap', 'duplicate_post' => 'אזהרה: העמוד הקודם נשמר פעמיים, השמירה השנייה לא בוצעה', 'view_documentation' => 'צפיה במדריכים', - 'app_title' => 'Free Online Invoicing', - 'app_description' => 'Invoice Ninja is a free, open-code solution for invoicing and billing customers. With Invoice Ninja, you can easily build and send beautiful invoices from any device that has access to the web. Your clients can print your invoices, download them as pdf files, and even pay you online from within the system.', + 'app_title' => 'חשבונית מקוונת בחינם', + 'app_description' => 'Invoice Ninja הוא פתרון חינמי בקוד פתוח ללקוחות חשבוניות וחיובים. עם Invoice Ninja, אתה יכול בקלות לבנות ולשלוח חשבוניות יפות מכל מכשיר שיש לו גישה לאינטרנט. הלקוחות שלך יכולים להדפיס את החשבוניות שלך, להוריד אותן כקבצי PDF, ואפילו לשלם לך באינטרנט מתוך המערכת.', 'rows' => 'שורות', 'www' => 'www', 'logo' => 'לוגו', @@ -691,9 +691,9 @@ $lang = array( 'disable' => 'השבת', 'invoice_quote_number' => 'מספרי חשבוניות והצעות מחיר', 'invoice_charges' => 'חשבוניות חיובים נוספים', - 'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.

:error', + 'notification_invoice_bounced' => 'לא הצלחנו לספק חשבונית :invoice ל- :contact .

:error', 'notification_invoice_bounced_subject' => 'שליחת חשבונית נכשלה: חשבונית', - 'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.

:error', + 'notification_quote_bounced' => 'לא הצלחנו לספק ציטוט :invoice ל- :contact .

:error', 'notification_quote_bounced_subject' => 'שליחת הצעת המחיר נכשלה: חשבונית', 'custom_invoice_link' => 'לינק מותאם אישית לחשבונית', 'total_invoiced' => 'סה"כ חשבוניות נשלחו', @@ -3008,7 +3008,7 @@ $lang = array( 'hosted_login' => 'התחברות מתארח', 'selfhost_login' => 'Selfhost התחברות', 'google_login' => 'Google Login', - 'thanks_for_patience' => 'Thank for your patience while we work to implement these features.

We hope to have them completed in the next few months.

Until then we\'ll continue to support the', + 'thanks_for_patience' => 'תודה על הסבלנות שלך בזמן שאנו עובדים על יישום התכונות הללו.

אנו מקווים להשלים אותם בחודשים הקרובים.

עד אז נמשיך לתמוך ב', 'legacy_mobile_app' => 'אפליקציה סלולרית מדור קודם', 'today' => 'היום', 'current' => 'נוֹכְחִי', @@ -3866,7 +3866,7 @@ $lang = array( 'cancellation_pending' => 'הביטול בהמתנה, ניצור איתך קשר!', 'list_of_payments' => 'רשימת תשלומים', 'payment_details' => 'פרטי התשלום', - 'list_of_payment_invoices' => 'Associate invoices', + 'list_of_payment_invoices' => 'חשבוניות שייך', 'list_of_payment_methods' => 'רשימת אמצעי תשלום', 'payment_method_details' => 'פרטים על אמצעי תשלום', 'permanently_remove_payment_method' => 'הסר לצמיתות את אמצעי התשלום הזה.', @@ -4923,7 +4923,7 @@ $lang = array( 'no_assigned_tasks' => 'אין משימות שניתנות לחיוב עבור הפרויקט הזה', 'authorization_failure' => 'אין מספיק הרשאות לביצוע פעולה זו', 'authorization_sms_failure' => 'אנא אמת את חשבונך כדי לשלוח אימיילים.', - 'white_label_body' => 'Thank you for purchasing a white label license.

Your license key is:

:license_key

You can manage your license here: https://invoiceninja.invoicing.co/client/login', + 'white_label_body' => 'תודה שרכשת רישיון לבן תווית.

מפתח הרישיון שלך הוא:

:license_key

אתה יכול לנהל את הרישיון שלך כאן: https://invoiceninja.invoicing.co/client/login', 'payment_type_Klarna' => 'קלרנה', 'payment_type_Interac E Transfer' => 'Interac E Transfer', 'xinvoice_payable' => 'ניתן לשלם תוך :payeddue ימים נטו עד :paydate', @@ -5088,7 +5088,7 @@ $lang = array( 'region' => 'אזור', 'county' => 'מָחוֹז', 'tax_details' => 'פרטי מס', - 'activity_10_online' => ':contact made payment :payment for invoice :invoice for :client', + 'activity_10_online' => ':contact ביצע תשלום :payment עבור חשבונית :invoice עבור :client', 'activity_10_manual' => ':user הזין תשלום :payment עבור חשבונית :invoice עבור :client', 'default_payment_type' => 'סוג תשלום ברירת מחדל', 'number_precision' => 'דיוק מספר', @@ -5118,7 +5118,7 @@ $lang = array( 'set_private' => 'הגדר פרטי', 'individual' => 'אִישִׁי', 'business' => 'עֵסֶק', - 'partnership' => 'Partnership', + 'partnership' => 'שׁוּתָפוּת', 'trust' => 'אמון', 'charity' => 'צדקה', 'government' => 'מֶמְשָׁלָה', @@ -5175,66 +5175,71 @@ $lang = array( 'charges' => 'חיובים', 'email_report' => 'דוא"ל דו"ח', 'payment_type_Pay Later' => 'שלם מאוחר יותר', - 'payment_type_credit' => 'Payment Type Credit', - 'payment_type_debit' => 'Payment Type Debit', - 'send_emails_to' => 'Send Emails To', - 'primary_contact' => 'Primary Contact', - 'all_contacts' => 'All Contacts', - 'insert_below' => 'Insert Below', - 'nordigen_handler_subtitle' => 'Bank account authentication. Selecting your institution to complete the request with your account credentials.', - 'nordigen_handler_error_heading_unknown' => 'An error has occured', - 'nordigen_handler_error_contents_unknown' => 'An unknown error has occurred! Reason:', - 'nordigen_handler_error_heading_token_invalid' => 'Invalid Token', - 'nordigen_handler_error_contents_token_invalid' => 'The provided token was invalid. Contact support for help, if this issue persists.', - 'nordigen_handler_error_heading_account_config_invalid' => 'Missing Credentials', - 'nordigen_handler_error_contents_account_config_invalid' => 'Invalid or missing credentials for Gocardless Bank Account Data. Contact support for help, if this issue persists.', - 'nordigen_handler_error_heading_not_available' => 'Not Available', - 'nordigen_handler_error_contents_not_available' => 'Feature unavailable, enterprise plan only.', - 'nordigen_handler_error_heading_institution_invalid' => 'Invalid Institution', - 'nordigen_handler_error_contents_institution_invalid' => 'The provided institution-id is invalid or no longer valid.', - 'nordigen_handler_error_heading_ref_invalid' => 'Invalid Reference', - 'nordigen_handler_error_contents_ref_invalid' => 'GoCardless did not provide a valid reference. Please run flow again and contact support, if this issue persists.', - 'nordigen_handler_error_heading_not_found' => 'Invalid Requisition', - 'nordigen_handler_error_contents_not_found' => 'GoCardless did not provide a valid reference. Please run flow again and contact support, if this issue persists.', - 'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready', - 'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.', - 'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected', - 'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Considder restarting the flow.', - 'nordigen_handler_restart' => 'Restart flow.', - 'nordigen_handler_return' => 'Return to application.', - 'lang_Lao' => 'Lao', - 'currency_lao_kip' => 'Lao kip', - 'yodlee_regions' => 'Regions: USA, UK, Australia & India', - 'nordigen_regions' => 'Regions: Europe & UK', - 'select_provider' => 'Select Provider', - 'nordigen_requisition_subject' => 'Requisition expired, please reauthenticate.', - 'nordigen_requisition_body' => 'Access to bank account feeds has expired as set in End User Agreement.

Please log into Invoice Ninja and re-authenticate with your banks to continue receiving transactions.', - 'participant' => 'Participant', - 'participant_name' => 'Participant name', - 'client_unsubscribed' => 'Client unsubscribed from emails.', - 'client_unsubscribed_help' => 'Client :client has unsubscribed from your e-mails. The client needs to consent to receive future emails from you.', - 'resubscribe' => 'Resubscribe', - 'subscribe' => 'Subscribe', - 'subscribe_help' => 'You are currently subscribed and will continue to receive email communications.', - 'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', - 'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact.

:error', - 'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', - 'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile', - 'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.', - 'please_select_an_invoice_or_credit' => 'Please select an invoice or credit', - 'mobile_version' => 'Mobile Version', - 'venmo' => 'Venmo', - 'my_bank' => 'MyBank', - 'pay_later' => 'Pay Later', - 'local_domain' => 'Local Domain', - 'verify_peer' => 'Verify Peer', - 'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key', - 'ar_detailed' => 'Accounts Receivable Detailed', - 'ar_summary' => 'Accounts Receivable Summary', - 'client_sales' => 'Client Sales', - 'user_sales' => 'User Sales', - 'iframe_url' => 'iFrame URL', - 'user_unsubscribed' => 'User unsubscribed from emails :link', + 'payment_type_credit' => 'אשראי מסוג תשלום', + 'payment_type_debit' => 'סוג תשלום חיוב', + 'send_emails_to' => 'שלח אימיילים אל', + 'primary_contact' => 'איש קשר ראשי', + 'all_contacts' => 'כל אנשי הקשר', + 'insert_below' => 'הכנס למטה', + 'nordigen_handler_subtitle' => 'אימות חשבון בנק. בחירת המוסד שלך להשלמת הבקשה עם אישורי החשבון שלך.', + 'nordigen_handler_error_heading_unknown' => 'ארעה שגיאה', + 'nordigen_handler_error_contents_unknown' => 'אירעה שגיאה לא ידועה! סיבה:', + 'nordigen_handler_error_heading_token_invalid' => 'אסימון לא חוקי', + 'nordigen_handler_error_contents_token_invalid' => 'האסימון שסופק היה לא חוקי. פנה לתמיכה לקבלת עזרה, אם הבעיה נמשכת.', + 'nordigen_handler_error_heading_account_config_invalid' => 'חסרים אישורים', + 'nordigen_handler_error_contents_account_config_invalid' => 'אישורים לא חוקיים או חסרים עבור נתוני חשבון בנק ללא Gocard. פנה לתמיכה לקבלת עזרה, אם הבעיה נמשכת.', + 'nordigen_handler_error_heading_not_available' => 'לא זמין', + 'nordigen_handler_error_contents_not_available' => 'התכונה לא זמינה, תוכנית ארגונית בלבד.', + 'nordigen_handler_error_heading_institution_invalid' => 'מוסד לא חוקי', + 'nordigen_handler_error_contents_institution_invalid' => 'מזהה המוסד שסופק אינו חוקי או אינו תקף עוד.', + 'nordigen_handler_error_heading_ref_invalid' => 'הפניה לא חוקית', + 'nordigen_handler_error_contents_ref_invalid' => 'GoCardless לא סיפק הפניה חוקית. אנא הפעל שוב את הזרימה ופנה לתמיכה, אם הבעיה נמשכת.', + 'nordigen_handler_error_heading_not_found' => 'דרישה לא חוקית', + 'nordigen_handler_error_contents_not_found' => 'GoCardless לא סיפק הפניה חוקית. אנא הפעל שוב את הזרימה ופנה לתמיכה, אם הבעיה נמשכת.', + 'nordigen_handler_error_heading_requisition_invalid_status' => 'לא מוכן', + 'nordigen_handler_error_contents_requisition_invalid_status' => 'התקשרת לאתר הזה מוקדם מדי. אנא סיים את ההרשאה ורענן דף זה. פנה לתמיכה לקבלת עזרה, אם הבעיה נמשכת.', + 'nordigen_handler_error_heading_requisition_no_accounts' => 'לא נבחרו חשבונות', + 'nordigen_handler_error_contents_requisition_no_accounts' => 'השירות לא החזיר חשבונות תקפים. שקול להפעיל מחדש את הזרימה.', + 'nordigen_handler_restart' => 'הפעל מחדש את הזרימה.', + 'nordigen_handler_return' => 'חזור ליישום.', + 'lang_Lao' => 'לאו', + 'currency_lao_kip' => 'לאו קיפ', + 'yodlee_regions' => 'אזורים: ארה"ב, בריטניה, אוסטרליה והודו', + 'nordigen_regions' => 'אזורים: אירופה ובריטניה', + 'select_provider' => 'בחר ספק', + 'nordigen_requisition_subject' => 'תוקף הדרישה פג, נא לאמת מחדש.', + 'nordigen_requisition_body' => 'הגישה לעדכונים של חשבון בנק פג כפי שהוגדר בהסכם משתמש הקצה.

אנא היכנס ל-Invoice Ninja ואמת מחדש עם הבנקים שלך כדי להמשיך לקבל עסקאות.', + 'participant' => 'מִשׁתַתֵף', + 'participant_name' => 'שם המשתתף', + 'client_unsubscribed' => 'הלקוח בוטל מנוי למיילים.', + 'client_unsubscribed_help' => 'לקוח :client ביטל את הרישום להודעות הדואר האלקטרוני שלך. הלקוח צריך להסכים לקבל ממך מיילים עתידיים.', + 'resubscribe' => 'הירשם מחדש', + 'subscribe' => 'הירשם', + 'subscribe_help' => 'אתה מנוי כרגע ותמשיך לקבל הודעות דוא"ל.', + 'unsubscribe_help' => 'אינך רשום כרגע, ולכן לא תקבל אימיילים בשלב זה.', + 'notification_purchase_order_bounced' => 'לא הצלחנו לספק הזמנת רכש :invoice ל- :contact .

:error', + 'notification_purchase_order_bounced_subject' => 'לא ניתן לספק הזמנת רכש :invoice', + 'show_pdfhtml_on_mobile' => 'הצג את גרסת ה-HTML של הישות בעת צפייה בנייד', + 'show_pdfhtml_on_mobile_help' => 'להדמיה משופרת, מציג גרסת HTML של החשבונית/הצעת המחיר בעת צפייה בנייד.', + 'please_select_an_invoice_or_credit' => 'אנא בחר חשבונית או זיכוי', + 'mobile_version' => 'גרסת נייד', + 'venmo' => 'ונמו', + 'my_bank' => 'הבנק שלי', + 'pay_later' => 'שלם מאוחר יותר', + 'local_domain' => 'דומיין מקומי', + 'verify_peer' => 'אמת את עמית', + 'nordigen_help' => 'הערה: חיבור חשבון דורש מפתח GoCardless/Norden API', + 'ar_detailed' => 'פירוט חשבונות חייבים', + 'ar_summary' => 'סיכום חשבונות חייבים', + 'client_sales' => 'מכירות לקוח', + 'user_sales' => 'מכירות משתמשים', + 'iframe_url' => 'כתובת אתר iFrame', + 'user_unsubscribed' => 'משתמש בוטל מנוי לדוא"ל :link', + 'use_available_payments' => 'השתמש בתשלומים זמינים', + 'test_email_sent' => 'דוא"ל נשלח בהצלחה', + 'gateway_type' => 'סוג שער', + 'save_template_body' => 'האם תרצה לשמור את מיפוי הייבוא הזה כתבנית לשימוש עתידי?', + 'save_as_template' => 'שמור מיפוי תבניות' ); return $lang; diff --git a/lang/hu/texts.php b/lang/hu/texts.php index 81cd1da267fd..0f59042e02b1 100644 --- a/lang/hu/texts.php +++ b/lang/hu/texts.php @@ -499,8 +499,8 @@ $lang = array( 'auto_wrap' => 'Automatikus sortörés', 'duplicate_post' => 'Kettőzött bejegyzés', 'view_documentation' => 'Dokumentáció megtekintése', - 'app_title' => 'Free Online Invoicing', - 'app_description' => 'Invoice Ninja is a free, open-code solution for invoicing and billing customers. With Invoice Ninja, you can easily build and send beautiful invoices from any device that has access to the web. Your clients can print your invoices, download them as pdf files, and even pay you online from within the system.', + 'app_title' => 'Ingyenes online számlázás', + 'app_description' => 'Az Invoice Ninja egy ingyenes, nyílt kódú megoldás az ügyfelek számlázására és számlázására. Az Invoice Ninja segítségével könnyedén készíthet és küldhet gyönyörű számlákat bármilyen eszközről, amely hozzáfér az internethez. Ügyfelei kinyomtathatják számláit, letölthetik pdf fájlként, és akár online is fizethetnek Önnek a rendszeren belül.', 'rows' => 'sorok', 'www' => 'www', 'logo' => 'Logó', @@ -686,9 +686,9 @@ $lang = array( 'disable' => 'Letiltás', 'invoice_quote_number' => 'Számla/Árajánlat száma', 'invoice_charges' => 'Számla díjai', - 'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.

:error', + 'notification_invoice_bounced' => 'Nem tudtuk kézbesíteni a :invoice számlát :contact címre.

:error', 'notification_invoice_bounced_subject' => 'Visszapattant számla értesítése', - 'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.

:error', + 'notification_quote_bounced' => 'Nem tudtuk kézbesíteni a :invoice árajánlatot :contact címre.

:error', 'notification_quote_bounced_subject' => 'Visszapattant árajánlat értesítése', 'custom_invoice_link' => 'Egyedi számla link', 'total_invoiced' => 'Összes számlázott összeg', @@ -2994,7 +2994,7 @@ adva :date', 'hosted_login' => 'Hostelt bejelentkezés', 'selfhost_login' => 'Önálló bejelentkezés', 'google_login' => 'Google bejelentkezés', - 'thanks_for_patience' => 'Thank for your patience while we work to implement these features.

We hope to have them completed in the next few months.

Until then we\'ll continue to support the', + 'thanks_for_patience' => 'Köszönjük türelmét, amíg ezen funkciók megvalósításán dolgozunk.

Reméljük, hogy a következő hónapokban elkészülnek velük.

Addig is továbbra is támogatjuk a', 'legacy_mobile_app' => 'Örökölt mobilalkalmazás', 'today' => 'Ma', 'current' => 'Jelenlegi', @@ -3852,7 +3852,7 @@ adva :date', 'cancellation_pending' => 'Lemondás folyamatban', 'list_of_payments' => 'Fizetések listája', 'payment_details' => 'Fizetési részletek', - 'list_of_payment_invoices' => 'Associate invoices', + 'list_of_payment_invoices' => 'Társított számlák', 'list_of_payment_methods' => 'Fizetési módok listája', 'payment_method_details' => 'Fizetési mód részletei', 'permanently_remove_payment_method' => 'Fizetési mód végleges eltávolítása', @@ -4909,7 +4909,7 @@ adva :date', 'no_assigned_tasks' => 'nincsenek hozzárendelt feladatok', 'authorization_failure' => 'engedélyezési hiba', 'authorization_sms_failure' => 'engedélyezési SMS-hiba', - 'white_label_body' => 'Thank you for purchasing a white label license.

Your license key is:

:license_key

You can manage your license here: https://invoiceninja.invoicing.co/client/login', + 'white_label_body' => 'Köszönjük, hogy fehér címkés licencet vásárolt.

Az Ön licenckulcsa:

:license_key

Licencét itt kezelheti: https://invoiceninja.invoicing.co/client/login', 'payment_type_Klarna' => 'fizetési típus: Klarna', 'payment_type_Interac E Transfer' => 'fizetési típus: Interac E átutalás', 'xinvoice_payable' => 'XInvoice fizetendő', @@ -5074,7 +5074,7 @@ adva :date', 'region' => 'Vidék', 'county' => 'Megye', 'tax_details' => 'Adóadatok', - 'activity_10_online' => ':contact made payment :payment for invoice :invoice for :client', + 'activity_10_online' => ':contact fizetett :payment :invoice :client számláért', 'activity_10_manual' => ':user beírta a :payment fizetést a :invoice számlához a :client számlához', 'default_payment_type' => 'Alapértelmezett fizetési típus', 'number_precision' => 'Számok pontossága', @@ -5104,7 +5104,7 @@ adva :date', 'set_private' => 'Privát beállítás', 'individual' => 'Egyedi', 'business' => 'Üzleti', - 'partnership' => 'Partnership', + 'partnership' => 'Partnerség', 'trust' => 'Bizalom', 'charity' => 'Adomány', 'government' => 'Kormány', @@ -5161,66 +5161,71 @@ adva :date', 'charges' => 'Díjak', 'email_report' => 'Jelentés e-mailben', 'payment_type_Pay Later' => 'Fizess később', - 'payment_type_credit' => 'Payment Type Credit', - 'payment_type_debit' => 'Payment Type Debit', - 'send_emails_to' => 'Send Emails To', - 'primary_contact' => 'Primary Contact', - 'all_contacts' => 'All Contacts', - 'insert_below' => 'Insert Below', - 'nordigen_handler_subtitle' => 'Bank account authentication. Selecting your institution to complete the request with your account credentials.', - 'nordigen_handler_error_heading_unknown' => 'An error has occured', - 'nordigen_handler_error_contents_unknown' => 'An unknown error has occurred! Reason:', - 'nordigen_handler_error_heading_token_invalid' => 'Invalid Token', - 'nordigen_handler_error_contents_token_invalid' => 'The provided token was invalid. Contact support for help, if this issue persists.', - 'nordigen_handler_error_heading_account_config_invalid' => 'Missing Credentials', - 'nordigen_handler_error_contents_account_config_invalid' => 'Invalid or missing credentials for Gocardless Bank Account Data. Contact support for help, if this issue persists.', - 'nordigen_handler_error_heading_not_available' => 'Not Available', - 'nordigen_handler_error_contents_not_available' => 'Feature unavailable, enterprise plan only.', - 'nordigen_handler_error_heading_institution_invalid' => 'Invalid Institution', - 'nordigen_handler_error_contents_institution_invalid' => 'The provided institution-id is invalid or no longer valid.', - 'nordigen_handler_error_heading_ref_invalid' => 'Invalid Reference', - 'nordigen_handler_error_contents_ref_invalid' => 'GoCardless did not provide a valid reference. Please run flow again and contact support, if this issue persists.', - 'nordigen_handler_error_heading_not_found' => 'Invalid Requisition', - 'nordigen_handler_error_contents_not_found' => 'GoCardless did not provide a valid reference. Please run flow again and contact support, if this issue persists.', - 'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready', - 'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.', - 'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected', - 'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Considder restarting the flow.', - 'nordigen_handler_restart' => 'Restart flow.', - 'nordigen_handler_return' => 'Return to application.', + 'payment_type_credit' => 'Fizetési típus Jóváírás', + 'payment_type_debit' => 'Fizetési típus Terhelés', + 'send_emails_to' => 'E-mailek küldése a címre', + 'primary_contact' => 'Elsődleges kapcsolattartó', + 'all_contacts' => 'Minden névjegy', + 'insert_below' => 'Beszúrás alább', + 'nordigen_handler_subtitle' => 'Bankszámla hitelesítés. Intézményének kiválasztása a kérelem kitöltéséhez a fiók hitelesítő adataival.', + 'nordigen_handler_error_heading_unknown' => 'Hiba történt', + 'nordigen_handler_error_contents_unknown' => 'Ismeretlen hiba lépett fel! Ok:', + 'nordigen_handler_error_heading_token_invalid' => 'Érvénytelen kód', + 'nordigen_handler_error_contents_token_invalid' => 'A megadott token érvénytelen. Ha a probléma továbbra is fennáll, forduljon az ügyfélszolgálathoz.', + 'nordigen_handler_error_heading_account_config_invalid' => 'Hiányzó hitelesítő adatok', + 'nordigen_handler_error_contents_account_config_invalid' => 'Érvénytelen vagy hiányzó hitelesítő adatok a Gocardless bankszámlaadatokhoz. Ha a probléma továbbra is fennáll, forduljon az ügyfélszolgálathoz.', + 'nordigen_handler_error_heading_not_available' => 'Nem elérhető', + 'nordigen_handler_error_contents_not_available' => 'A funkció nem érhető el, csak vállalati csomag.', + 'nordigen_handler_error_heading_institution_invalid' => 'Érvénytelen intézmény', + 'nordigen_handler_error_contents_institution_invalid' => 'A megadott intézményazonosító érvénytelen vagy már nem érvényes.', + 'nordigen_handler_error_heading_ref_invalid' => 'Érvénytelen hivatkozás', + 'nordigen_handler_error_contents_ref_invalid' => 'A GoCardless nem adott érvényes referenciát. Futtassa újra a folyamatot, és ha a probléma továbbra is fennáll, forduljon az ügyfélszolgálathoz.', + 'nordigen_handler_error_heading_not_found' => 'Érvénytelen igénylés', + 'nordigen_handler_error_contents_not_found' => 'A GoCardless nem adott érvényes referenciát. Futtassa újra a folyamatot, és ha a probléma továbbra is fennáll, forduljon az ügyfélszolgálathoz.', + 'nordigen_handler_error_heading_requisition_invalid_status' => 'Nem áll készen', + 'nordigen_handler_error_contents_requisition_invalid_status' => 'Túl korán hívta fel ezt az oldalt. Kérjük, fejezze be az engedélyezést, és frissítse ezt az oldalt. Ha a probléma továbbra is fennáll, forduljon az ügyfélszolgálathoz.', + 'nordigen_handler_error_heading_requisition_no_accounts' => 'Nincsenek kiválasztott fiókok', + 'nordigen_handler_error_contents_requisition_no_accounts' => 'A szolgáltatás nem adott vissza egyetlen érvényes fiókot sem. Fontolja meg az áramlás újraindítását.', + 'nordigen_handler_restart' => 'Folyamat újraindítása.', + 'nordigen_handler_return' => 'Vissza az alkalmazáshoz.', 'lang_Lao' => 'Lao', - 'currency_lao_kip' => 'Lao kip', - 'yodlee_regions' => 'Regions: USA, UK, Australia & India', - 'nordigen_regions' => 'Regions: Europe & UK', - 'select_provider' => 'Select Provider', - 'nordigen_requisition_subject' => 'Requisition expired, please reauthenticate.', - 'nordigen_requisition_body' => 'Access to bank account feeds has expired as set in End User Agreement.

Please log into Invoice Ninja and re-authenticate with your banks to continue receiving transactions.', - 'participant' => 'Participant', - 'participant_name' => 'Participant name', - 'client_unsubscribed' => 'Client unsubscribed from emails.', - 'client_unsubscribed_help' => 'Client :client has unsubscribed from your e-mails. The client needs to consent to receive future emails from you.', - 'resubscribe' => 'Resubscribe', - 'subscribe' => 'Subscribe', - 'subscribe_help' => 'You are currently subscribed and will continue to receive email communications.', - 'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', - 'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact.

:error', - 'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', - 'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile', - 'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.', - 'please_select_an_invoice_or_credit' => 'Please select an invoice or credit', - 'mobile_version' => 'Mobile Version', + 'currency_lao_kip' => 'laoszi kip', + 'yodlee_regions' => 'Régiók: USA, Egyesült Királyság, Ausztrália és India', + 'nordigen_regions' => 'Régiók: Európa és az Egyesült Királyság', + 'select_provider' => 'Válassza a Szolgáltatót', + 'nordigen_requisition_subject' => 'Az igénylés lejárt, kérjük, hitelesítse újra.', + 'nordigen_requisition_body' => 'A bankszámla-hírcsatornákhoz való hozzáférés a végfelhasználói szerződésben meghatározottak szerint lejárt.

Kérjük, jelentkezzen be az Invoice Ninja szolgáltatásba, és hitelesítse újra bankjaival a tranzakciók fogadásához.', + 'participant' => 'Résztvevő', + 'participant_name' => 'Résztvevő neve', + 'client_unsubscribed' => 'Az ügyfél leiratkozott az e-mailekről.', + 'client_unsubscribed_help' => ':client ügyfél leiratkozott az Ön e-mailjeiről. Az ügyfélnek hozzá kell járulnia ahhoz, hogy a jövőben e-maileket kapjon Öntől.', + 'resubscribe' => 'Újra feliratkozás', + 'subscribe' => 'Iratkozz fel', + 'subscribe_help' => 'Jelenleg feliratkozott, és továbbra is e-mail üzeneteket fog kapni.', + 'unsubscribe_help' => 'Ön jelenleg nem iratkozott fel, ezért jelenleg nem fog e-maileket kapni.', + 'notification_purchase_order_bounced' => 'Nem tudtuk kézbesíteni a :invoice megrendelést :contact címre.

:error', + 'notification_purchase_order_bounced_subject' => 'Nem sikerült kézbesíteni a :invoice beszerzési rendelést', + 'show_pdfhtml_on_mobile' => 'Az entitás HTML-verziójának megjelenítése mobilon', + 'show_pdfhtml_on_mobile_help' => 'A jobb megjelenítés érdekében a számla/ajánlat HTML-változatát jeleníti meg, ha mobilon nézi.', + 'please_select_an_invoice_or_credit' => 'Kérjük, válasszon számlát vagy jóváírást', + 'mobile_version' => 'Mobil verzió', 'venmo' => 'Venmo', 'my_bank' => 'MyBank', - 'pay_later' => 'Pay Later', - 'local_domain' => 'Local Domain', + 'pay_later' => 'Fizess később', + 'local_domain' => 'Helyi domain', 'verify_peer' => 'Verify Peer', - 'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key', - 'ar_detailed' => 'Accounts Receivable Detailed', - 'ar_summary' => 'Accounts Receivable Summary', - 'client_sales' => 'Client Sales', - 'user_sales' => 'User Sales', + 'nordigen_help' => 'Megjegyzés: egy fiók összekapcsolásához GoCardless/Nordigen API-kulcs szükséges', + 'ar_detailed' => 'Követelések részletes', + 'ar_summary' => 'Követelések összefoglalója', + 'client_sales' => 'Ügyfél értékesítés', + 'user_sales' => 'Felhasználói értékesítés', 'iframe_url' => 'iFrame URL', - 'user_unsubscribed' => 'User unsubscribed from emails :link', + 'user_unsubscribed' => 'A felhasználó leiratkozott az e-mailekről :link', + 'use_available_payments' => 'Használja az Elérhető fizetéseket', + 'test_email_sent' => 'E-mail sikeresen elküldve', + 'gateway_type' => 'Átjáró típusa', + 'save_template_body' => 'Szeretné menteni ezt az importleképezést sablonként későbbi használatra?', + 'save_as_template' => 'Sablonleképezés mentése' ); return $lang; diff --git a/lang/lo_LA/texts.php b/lang/lo_LA/texts.php index 01675e68f642..09ff1e1cdc43 100644 --- a/lang/lo_LA/texts.php +++ b/lang/lo_LA/texts.php @@ -506,8 +506,8 @@ $lang = array( 'auto_wrap' => 'ຫໍ່ເສັ້ນອັດຕະໂນມັດ', 'duplicate_post' => 'ຄຳເຕືອນ: ໜ້າກ່ອນໜ້ານີ້ຖືກສົ່ງສອງຄັ້ງ. ການຍື່ນສະເຫນີທີສອງໄດ້ຖືກລະເລີຍ.', 'view_documentation' => 'ເບິ່ງເອກະສານ', - 'app_title' => 'Free Online Invoicing', - 'app_description' => 'Invoice Ninja is a free, open-code solution for invoicing and billing customers. With Invoice Ninja, you can easily build and send beautiful invoices from any device that has access to the web. Your clients can print your invoices, download them as pdf files, and even pay you online from within the system.', + 'app_title' => 'ໃບແຈ້ງໜີ້ອອນໄລນ໌ຟຣີ', + 'app_description' => 'Invoice Ninja ເປັນການແກ້ໄຂລະຫັດເປີດຟຣີສໍາລັບລູກຄ້າໃບແຈ້ງໜີ້ ແລະໃບບິນ. ດ້ວຍ Invoice Ninja, ທ່ານສາມາດສ້າງ ແລະສົ່ງໃບແຈ້ງໜີ້ທີ່ສວຍງາມໄດ້ຢ່າງງ່າຍດາຍຈາກທຸກອຸປະກອນທີ່ເຂົ້າເຖິງເວັບ. ລູກ​ຄ້າ​ຂອງ​ທ່ານ​ສາ​ມາດ​ພິມ​ໃບ​ເກັບ​ເງິນ​ຂອງ​ທ່ານ​, ດາວ​ນ​໌​ໂຫລດ​ເປັນ​ໄຟລ​໌ pdf​, ແລະ​ເຖິງ​ແມ່ນ​ວ່າ​ທ່ານ​ຈ່າຍ​ເງິນ​ອອນ​ໄລ​ນ​໌​ຈາກ​ພາຍ​ໃນ​ລະ​ບົບ​.', 'rows' => 'ແຖວ', 'www' => 'www', 'logo' => 'ໂລໂກ້', @@ -693,9 +693,9 @@ $lang = array( 'disable' => 'ປິດການໃຊ້ງານ', 'invoice_quote_number' => 'ໃບເກັບເງິນ ແລະໝາຍເລກໃບສະເໜີລາຄາ', 'invoice_charges' => 'ການເກັບຄ່າເພີ່ມ', - 'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.

:error', + 'notification_invoice_bounced' => 'ພວກເຮົາບໍ່ສາມາດຈັດສົ່ງໃບແຈ້ງໜີ້ :invoice ໄປໃຫ້ :contact .

:error', 'notification_invoice_bounced_subject' => 'ບໍ່ສາມາດສົ່ງໃບແຈ້ງໜີ້: ໃບເກັບເງິນໄດ້', - 'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.

:error', + 'notification_quote_bounced' => 'ພວກເຮົາບໍ່ສາມາດສົ່ງ Quote :invoice ຫາ :contact .

:error', 'notification_quote_bounced_subject' => 'ບໍ່ສາມາດສົ່ງ Quote : invoice', 'custom_invoice_link' => 'ລິ້ງໃບເກັບເງິນແບບກຳນົດເອງ', 'total_invoiced' => 'ໃບແຈ້ງໜີ້ທັງໝົດ', @@ -3010,7 +3010,7 @@ $lang = array( 'hosted_login' => 'ການເຂົ້າສູ່ລະບົບທີ່ເປັນເຈົ້າພາບ', 'selfhost_login' => 'ການເຂົ້າສູ່ລະບົບດ້ວຍຕົນເອງ', 'google_login' => 'ເຂົ້າສູ່ລະບົບ Google', - 'thanks_for_patience' => 'Thank for your patience while we work to implement these features.

We hope to have them completed in the next few months.

Until then we\'ll continue to support the', + 'thanks_for_patience' => 'ຂອບໃຈສໍາລັບຄວາມອົດທົນຂອງທ່ານໃນຂະນະທີ່ພວກເຮົາເຮັດວຽກເພື່ອປະຕິບັດຄຸນສົມບັດເຫຼົ່ານີ້.

ພວກເຮົາຫວັງວ່າຈະໃຫ້ພວກເຂົາສໍາເລັດໃນສອງສາມເດືອນຂ້າງຫນ້າ.

ຈົນກ່ວານັ້ນ, ພວກເຮົາຈະສືບຕໍ່ສະຫນັບສະຫນູນ', 'legacy_mobile_app' => 'ແອັບຯມືຖືແບບເກົ່າ', 'today' => 'ມື້ນີ້', 'current' => 'ປະຈຸບັນ', @@ -3868,7 +3868,7 @@ $lang = array( 'cancellation_pending' => 'ລໍຖ້າການຍົກເລີກ, ພວກເຮົາຈະຕິດຕໍ່ຫາ!', 'list_of_payments' => 'ລາຍຊື່ການຈ່າຍເງິນ', 'payment_details' => 'ລາຍລະອຽດຂອງການຈ່າຍເງິນ', - 'list_of_payment_invoices' => 'Associate invoices', + 'list_of_payment_invoices' => 'ໃບແຈ້ງໜີ້ທີ່ກ່ຽວຂ້ອງ', 'list_of_payment_methods' => 'ລາຍຊື່ວິທີຈ່າຍເງິນ', 'payment_method_details' => 'ລາຍລະອຽດຂອງວິທີການຊໍາລະ', 'permanently_remove_payment_method' => 'ລຶບວິທີການຈ່າຍເງິນນີ້ອອກຖາວອນ.', @@ -4925,7 +4925,7 @@ $lang = array( 'no_assigned_tasks' => 'ບໍ່ມີໜ້າວຽກທີ່ສາມາດເກັບເງິນໄດ້ສຳລັບໂຄງການນີ້', 'authorization_failure' => 'ການອະນຸຍາດບໍ່ພຽງພໍເພື່ອປະຕິບັດການນີ້', 'authorization_sms_failure' => 'ກະລຸນາກວດສອບບັນຊີຂອງທ່ານເພື່ອສົ່ງອີເມວ.', - 'white_label_body' => 'Thank you for purchasing a white label license.

Your license key is:

:license_key

You can manage your license here: https://invoiceninja.invoicing.co/client/login', + 'white_label_body' => 'ຂໍ​ຂອບ​ໃຈ​ທ່ານ​ສໍາ​ລັບ​ການ​ຊື້​ໃບ​ອະ​ນຸ​ຍາດ​ປ້າຍ​ສີ​ຂາວ​.

ກະແຈໃບອະນຸຍາດຂອງທ່ານແມ່ນ:

:license_key

ທ່ານສາມາດຈັດການໃບອະນຸຍາດຂອງທ່ານໄດ້ທີ່ນີ້: https://invoiceninja.invoicing.co/client/login', 'payment_type_Klarna' => 'ຄລານາ', 'payment_type_Interac E Transfer' => 'Interac E Transfer', 'xinvoice_payable' => 'ຊໍາລະພາຍໃນ: payeddue ວັນສຸດທິຈົນກ່ວາ: paydate', @@ -5120,7 +5120,7 @@ $lang = array( 'set_private' => 'ຕັ້ງເປັນສ່ວນຕົວ', 'individual' => 'ບຸກຄົນ', 'business' => 'ທຸລະກິດ', - 'partnership' => 'Partnership', + 'partnership' => 'ຫຸ້ນສ່ວນ', 'trust' => 'ຄວາມໄວ້ວາງໃຈ', 'charity' => 'ການກຸສົນ', 'government' => 'ລັດຖະບານ', @@ -5206,37 +5206,42 @@ $lang = array( 'nordigen_handler_return' => 'ກັບຄືນໄປຫາແອັບພລິເຄຊັນ.', 'lang_Lao' => 'ລາວ', 'currency_lao_kip' => 'ລາວກີບ', - 'yodlee_regions' => 'Regions: USA, UK, Australia & India', - 'nordigen_regions' => 'Regions: Europe & UK', + 'yodlee_regions' => 'ພາກພື້ນ: ສະຫະລັດ, ອັງກິດ, ອົດສະຕາລີ & ອິນເດຍ', + 'nordigen_regions' => 'ພາກພື້ນ: ເອີຣົບ & ອັງກິດ', 'select_provider' => 'ເລືອກຜູ້ໃຫ້ບໍລິການ', - 'nordigen_requisition_subject' => 'Requisition expired, please reauthenticate.', - 'nordigen_requisition_body' => 'Access to bank account feeds has expired as set in End User Agreement.

Please log into Invoice Ninja and re-authenticate with your banks to continue receiving transactions.', - 'participant' => 'Participant', - 'participant_name' => 'Participant name', - 'client_unsubscribed' => 'Client unsubscribed from emails.', - 'client_unsubscribed_help' => 'Client :client has unsubscribed from your e-mails. The client needs to consent to receive future emails from you.', - 'resubscribe' => 'Resubscribe', - 'subscribe' => 'Subscribe', - 'subscribe_help' => 'You are currently subscribed and will continue to receive email communications.', - 'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', - 'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact.

:error', - 'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', - 'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile', - 'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.', - 'please_select_an_invoice_or_credit' => 'Please select an invoice or credit', - 'mobile_version' => 'Mobile Version', + 'nordigen_requisition_subject' => 'ການຮ້ອງຂໍໝົດອາຍຸແລ້ວ, ກະລຸນາຢັ້ງຢືນຄືນໃໝ່.', + 'nordigen_requisition_body' => 'ການເຂົ້າເຖິງຟີດບັນຊີທະນາຄານໝົດອາຍຸຕາມທີ່ກຳນົດໄວ້ໃນຂໍ້ຕົກລົງຜູ້ໃຊ້ສຸດທ້າຍ.

ກະລຸນາເຂົ້າສູ່ລະບົບ Invoice Ninja ແລະຢືນຢັນຄືນໃໝ່ກັບທະນາຄານຂອງທ່ານເພື່ອສືບຕໍ່ຮັບທຸລະກຳ.', + 'participant' => 'ຜູ້ເຂົ້າຮ່ວມ', + 'participant_name' => 'ຊື່ຜູ້ເຂົ້າຮ່ວມ', + 'client_unsubscribed' => 'ລູກຄ້າເຊົາຕິດຕາມອີເມວແລ້ວ.', + 'client_unsubscribed_help' => 'ລູກຄ້າ :client ໄດ້ເຊົາຕິດຕາມອີເມວຂອງເຈົ້າແລ້ວ. ລູກຄ້າຕ້ອງການຍິນຍອມເພື່ອຮັບອີເມວໃນອະນາຄົດຈາກທ່ານ.', + 'resubscribe' => 'ສະໝັກໃໝ່', + 'subscribe' => 'ຈອງ', + 'subscribe_help' => 'ປະຈຸບັນທ່ານສະໝັກສະມາຊິກ ແລະຈະສືບຕໍ່ໄດ້ຮັບການຕິດຕໍ່ທາງອີເມລ໌.', + 'unsubscribe_help' => 'ໃນປັດຈຸບັນທ່ານຍັງບໍ່ໄດ້ສະຫມັກ, ແລະດັ່ງນັ້ນ, ຈະບໍ່ໄດ້ຮັບອີເມລ໌ໃນເວລານີ້.', + 'notification_purchase_order_bounced' => 'ພວກເຮົາບໍ່ສາມາດຈັດສົ່ງຄຳສັ່ງຊື້ :invoice ຫາ :contact .

:error', + 'notification_purchase_order_bounced_subject' => 'ບໍ່ສາມາດຈັດສົ່ງຄໍາສັ່ງສັ່ງຊື້ :invoice', + 'show_pdfhtml_on_mobile' => 'ສະແດງສະບັບ HTML ຂອງນິຕິບຸກຄົນໃນເວລາເບິ່ງໃນມືຖື', + 'show_pdfhtml_on_mobile_help' => 'ສໍາລັບການປັບປຸງການເບິ່ງເຫັນ, ສະແດງສະບັບ HTML ຂອງໃບແຈ້ງຫນີ້ / ວົງຢືມໃນເວລາເບິ່ງໃນມືຖື.', + 'please_select_an_invoice_or_credit' => 'ກະລຸນາເລືອກໃບແຈ້ງໜີ້ ຫຼືສິນເຊື່ອ', + 'mobile_version' => 'ສະບັບມືຖື', 'venmo' => 'Venmo', 'my_bank' => 'MyBank', - 'pay_later' => 'Pay Later', - 'local_domain' => 'Local Domain', - 'verify_peer' => 'Verify Peer', - 'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key', - 'ar_detailed' => 'Accounts Receivable Detailed', - 'ar_summary' => 'Accounts Receivable Summary', - 'client_sales' => 'Client Sales', - 'user_sales' => 'User Sales', + 'pay_later' => 'ຈ່າຍພາຍຫຼັງ', + 'local_domain' => 'ໂດເມນທ້ອງຖິ່ນ', + 'verify_peer' => 'ຢືນຢັນຄູ່', + 'nordigen_help' => 'ໝາຍເຫດ: ການເຊື່ອມຕໍ່ບັນຊີຕ້ອງການລະຫັດ GoCardless/Nordigen API', + 'ar_detailed' => 'ລາຍ​ລະ​ອຽດ​ບັນ​ຊີ​ທີ່​ຮັບ​ໄດ້​', + 'ar_summary' => 'ສະຫຼຸບບັນຊີຮັບ', + 'client_sales' => 'ການຂາຍລູກຄ້າ', + 'user_sales' => 'ການຂາຍຜູ້ໃຊ້', 'iframe_url' => 'iFrame URL', - 'user_unsubscribed' => 'User unsubscribed from emails :link', + 'user_unsubscribed' => 'ຜູ້ໃຊ້ເຊົາຕິດຕາມອີເມວ :link', + 'use_available_payments' => 'ໃຊ້ການຈ່າຍເງິນທີ່ມີຢູ່', + 'test_email_sent' => 'ສົ່ງອີເມວສຳເລັດແລ້ວ', + 'gateway_type' => 'ປະເພດປະຕູ', + 'save_template_body' => 'ທ່ານຕ້ອງການບັນທຶກແຜນທີ່ການນໍາເຂົ້ານີ້ເປັນແມ່ແບບສໍາລັບການນໍາໃຊ້ໃນອະນາຄົດບໍ?', + 'save_as_template' => 'ບັນທຶກການສ້າງແຜນທີ່ແມ່ແບບ' ); return $lang; diff --git a/lang/nl/texts.php b/lang/nl/texts.php index 49b89598c2da..4bee1efe97ad 100644 --- a/lang/nl/texts.php +++ b/lang/nl/texts.php @@ -506,8 +506,8 @@ $lang = array( 'auto_wrap' => 'Automatisch regel afbreken', 'duplicate_post' => 'Opgelet: de volgende pagina is twee keer doorgestuurd. De tweede verzending is genegeerd.', 'view_documentation' => 'Bekijk documentatie', - 'app_title' => 'Free Online Invoicing', - 'app_description' => 'Invoice Ninja is a free, open-code solution for invoicing and billing customers. With Invoice Ninja, you can easily build and send beautiful invoices from any device that has access to the web. Your clients can print your invoices, download them as pdf files, and even pay you online from within the system.', + 'app_title' => 'Gratis online facturering', + 'app_description' => 'Invoice Ninja is een gratis, open-code oplossing voor facturatie- en factureringsklanten. Met Invoice Ninja kunt u eenvoudig prachtige facturen maken en verzenden vanaf elk apparaat dat toegang heeft tot internet. Uw klanten kunnen uw facturen afdrukken, downloaden als pdf-bestanden en u zelfs online betalen vanuit het systeem.', 'rows' => 'rijen', 'www' => 'www', 'logo' => 'Logo', @@ -693,9 +693,9 @@ $lang = array( 'disable' => 'Uitzetten', 'invoice_quote_number' => 'Factuur- en offertenummers', 'invoice_charges' => 'Facturatiekosten', - 'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.

:error', + 'notification_invoice_bounced' => 'We konden factuur :invoice niet leveren aan :contact .

:error', 'notification_invoice_bounced_subject' => 'Factuur :invoice kon niet worden afgeleverd', - 'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.

:error', + 'notification_quote_bounced' => 'We konden Quote :invoice niet leveren aan :contact .

:error', 'notification_quote_bounced_subject' => 'Offerte :invoice kon niet worden afgeleverd', 'custom_invoice_link' => 'Eigen factuurlink', 'total_invoiced' => 'Totaal gefactureerd', @@ -3007,7 +3007,7 @@ Kom terug naar deze betalingsmethode pagina zodra u de bedragen heeft ontvangen 'hosted_login' => 'Hosted login', 'selfhost_login' => 'Self-Host login', 'google_login' => 'Google Login', - 'thanks_for_patience' => 'Thank for your patience while we work to implement these features.

We hope to have them completed in the next few months.

Until then we\'ll continue to support the', + 'thanks_for_patience' => 'Bedankt voor uw geduld terwijl we werken aan de implementatie van deze functies.

We hopen ze in de komende maanden af te ronden.

Tot die tijd blijven wij de stichting steunen', 'legacy_mobile_app' => 'oude mobiele app', 'today' => 'Vandaag', 'current' => 'Huidige', @@ -3865,7 +3865,7 @@ Kom terug naar deze betalingsmethode pagina zodra u de bedragen heeft ontvangen 'cancellation_pending' => 'Annulatie in aanvraag, we nemen contact met u op!', 'list_of_payments' => 'Lijst met betalingen', 'payment_details' => 'Details van de betaling', - 'list_of_payment_invoices' => 'Associate invoices', + 'list_of_payment_invoices' => 'Facturen koppelen', 'list_of_payment_methods' => 'Lijst met betalingsmethodes', 'payment_method_details' => 'Details van betalingsmethodes', 'permanently_remove_payment_method' => 'Verwijder deze betalingsmethode definitief', @@ -4925,7 +4925,7 @@ Email: :email
', 'no_assigned_tasks' => 'Geen factureerbare taken voor dit project', 'authorization_failure' => 'Onvoldoende machtigingen om deze actie uit te voeren', 'authorization_sms_failure' => 'Verifieer uw account om e-mails te verzenden.', - 'white_label_body' => 'Thank you for purchasing a white label license.

Your license key is:

:license_key

You can manage your license here: https://invoiceninja.invoicing.co/client/login', + 'white_label_body' => 'Bedankt voor het aanschaffen van een white label-licentie.

Uw licentiesleutel is:

:license_key

U kunt uw licentie hier beheren: https://invoiceninja.invoicing.co/client/login', 'payment_type_Klarna' => 'Klarna', 'payment_type_Interac E Transfer' => 'Interac E-overdracht', 'xinvoice_payable' => 'Te betalen binnen :payeddue vervaldagen netto tot :paydate', @@ -5090,7 +5090,7 @@ Email: :email
', 'region' => 'Regio', 'county' => 'District', 'tax_details' => 'Belastinggegevens', - 'activity_10_online' => ':contact made payment :payment for invoice :invoice for :client', + 'activity_10_online' => ':contact heeft betaling uitgevoerd :payment voor factuur :invoice voor :client', 'activity_10_manual' => ':user ingevoerde betaling :payment voor factuur :invoice voor :client', 'default_payment_type' => 'Standaard betalingstype', 'number_precision' => 'Cijferprecisie', @@ -5120,7 +5120,7 @@ Email: :email
', 'set_private' => 'Privé instellen', 'individual' => 'Individueel', 'business' => 'Bedrijf', - 'partnership' => 'Partnership', + 'partnership' => 'Vennootschap', 'trust' => 'Vertrouwen', 'charity' => 'Goed doel', 'government' => 'Regering', @@ -5177,66 +5177,71 @@ Email: :email
', 'charges' => 'Kosten', 'email_report' => 'E-mailrapport', 'payment_type_Pay Later' => 'Betaal later', - 'payment_type_credit' => 'Payment Type Credit', - 'payment_type_debit' => 'Payment Type Debit', - 'send_emails_to' => 'Send Emails To', - 'primary_contact' => 'Primary Contact', - 'all_contacts' => 'All Contacts', - 'insert_below' => 'Insert Below', - 'nordigen_handler_subtitle' => 'Bank account authentication. Selecting your institution to complete the request with your account credentials.', - 'nordigen_handler_error_heading_unknown' => 'An error has occured', - 'nordigen_handler_error_contents_unknown' => 'An unknown error has occurred! Reason:', - 'nordigen_handler_error_heading_token_invalid' => 'Invalid Token', - 'nordigen_handler_error_contents_token_invalid' => 'The provided token was invalid. Contact support for help, if this issue persists.', - 'nordigen_handler_error_heading_account_config_invalid' => 'Missing Credentials', - 'nordigen_handler_error_contents_account_config_invalid' => 'Invalid or missing credentials for Gocardless Bank Account Data. Contact support for help, if this issue persists.', - 'nordigen_handler_error_heading_not_available' => 'Not Available', - 'nordigen_handler_error_contents_not_available' => 'Feature unavailable, enterprise plan only.', - 'nordigen_handler_error_heading_institution_invalid' => 'Invalid Institution', - 'nordigen_handler_error_contents_institution_invalid' => 'The provided institution-id is invalid or no longer valid.', - 'nordigen_handler_error_heading_ref_invalid' => 'Invalid Reference', - 'nordigen_handler_error_contents_ref_invalid' => 'GoCardless did not provide a valid reference. Please run flow again and contact support, if this issue persists.', - 'nordigen_handler_error_heading_not_found' => 'Invalid Requisition', - 'nordigen_handler_error_contents_not_found' => 'GoCardless did not provide a valid reference. Please run flow again and contact support, if this issue persists.', - 'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready', - 'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.', - 'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected', - 'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Considder restarting the flow.', - 'nordigen_handler_restart' => 'Restart flow.', - 'nordigen_handler_return' => 'Return to application.', - 'lang_Lao' => 'Lao', - 'currency_lao_kip' => 'Lao kip', - 'yodlee_regions' => 'Regions: USA, UK, Australia & India', - 'nordigen_regions' => 'Regions: Europe & UK', - 'select_provider' => 'Select Provider', - 'nordigen_requisition_subject' => 'Requisition expired, please reauthenticate.', - 'nordigen_requisition_body' => 'Access to bank account feeds has expired as set in End User Agreement.

Please log into Invoice Ninja and re-authenticate with your banks to continue receiving transactions.', - 'participant' => 'Participant', - 'participant_name' => 'Participant name', - 'client_unsubscribed' => 'Client unsubscribed from emails.', - 'client_unsubscribed_help' => 'Client :client has unsubscribed from your e-mails. The client needs to consent to receive future emails from you.', - 'resubscribe' => 'Resubscribe', - 'subscribe' => 'Subscribe', - 'subscribe_help' => 'You are currently subscribed and will continue to receive email communications.', - 'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', - 'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact.

:error', - 'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', - 'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile', - 'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.', - 'please_select_an_invoice_or_credit' => 'Please select an invoice or credit', - 'mobile_version' => 'Mobile Version', + 'payment_type_credit' => 'Betalingstype Krediet', + 'payment_type_debit' => 'Betalingswijze Debet', + 'send_emails_to' => 'Stuur e-mails naar', + 'primary_contact' => 'Primaire contactpersoon', + 'all_contacts' => 'Alle contacten', + 'insert_below' => 'Vul hieronder in', + 'nordigen_handler_subtitle' => 'Authenticatie van bankrekening. Selecteer uw instelling om het verzoek te voltooien met uw accountgegevens.', + 'nordigen_handler_error_heading_unknown' => 'Er is een fout opgetreden', + 'nordigen_handler_error_contents_unknown' => 'Er is een onbekende fout opgetreden! Reden:', + 'nordigen_handler_error_heading_token_invalid' => 'Ongeldige Token', + 'nordigen_handler_error_contents_token_invalid' => 'Het opgegeven token was ongeldig. Neem contact op met de ondersteuning voor hulp als dit probleem zich blijft voordoen.', + 'nordigen_handler_error_heading_account_config_invalid' => 'Ontbrekende inloggegevens', + 'nordigen_handler_error_contents_account_config_invalid' => 'Ongeldige of ontbrekende inloggegevens voor Gocardless-bankrekeninggegevens. Neem contact op met de ondersteuning voor hulp als dit probleem zich blijft voordoen.', + 'nordigen_handler_error_heading_not_available' => 'Niet beschikbaar', + 'nordigen_handler_error_contents_not_available' => 'Functie niet beschikbaar, alleen ondernemingsplan.', + 'nordigen_handler_error_heading_institution_invalid' => 'Ongeldige instelling', + 'nordigen_handler_error_contents_institution_invalid' => 'Het opgegeven instellings-ID is ongeldig of niet meer geldig.', + 'nordigen_handler_error_heading_ref_invalid' => 'Ongeldige referentie', + 'nordigen_handler_error_contents_ref_invalid' => 'GoCardless heeft geen geldige referentie opgegeven. Voer de stroom opnieuw uit en neem contact op met de ondersteuning als dit probleem zich blijft voordoen.', + 'nordigen_handler_error_heading_not_found' => 'Ongeldige aanvraag', + 'nordigen_handler_error_contents_not_found' => 'GoCardless heeft geen geldige referentie opgegeven. Voer de stroom opnieuw uit en neem contact op met de ondersteuning als dit probleem zich blijft voordoen.', + 'nordigen_handler_error_heading_requisition_invalid_status' => 'Niet klaar', + 'nordigen_handler_error_contents_requisition_invalid_status' => 'Je hebt deze site te vroeg gebeld. Voltooi de autorisatie en vernieuw deze pagina. Neem contact op met de ondersteuning voor hulp als dit probleem zich blijft voordoen.', + 'nordigen_handler_error_heading_requisition_no_accounts' => 'Geen accounts geselecteerd', + 'nordigen_handler_error_contents_requisition_no_accounts' => 'De service heeft geen geldige accounts geretourneerd. Overweeg om de stroom opnieuw te starten.', + 'nordigen_handler_restart' => 'Start de stroom opnieuw.', + 'nordigen_handler_return' => 'Terug naar applicatie.', + 'lang_Lao' => 'Laos', + 'currency_lao_kip' => 'Laotiaanse kip', + 'yodlee_regions' => 'Regio's: VS, VK, Australië en India', + 'nordigen_regions' => 'Regio's: Europa en VK', + 'select_provider' => 'Selecteer Aanbieder', + 'nordigen_requisition_subject' => 'Aanvraag is verlopen. Authenticeer opnieuw.', + 'nordigen_requisition_body' => 'De toegang tot bankrekeningfeeds is verlopen zoals vastgelegd in de Eindgebruikersovereenkomst.

Meld u aan bij Invoice Ninja en authenticeer opnieuw bij uw banken om transacties te blijven ontvangen.', + 'participant' => 'Deelnemer', + 'participant_name' => 'Naam deelnemer', + 'client_unsubscribed' => 'Klant heeft zich afgemeld voor e-mails.', + 'client_unsubscribed_help' => 'Klant :client heeft zich afgemeld voor uw e-mails. De klant moet toestemming geven om toekomstige e-mails van u te ontvangen.', + 'resubscribe' => 'Opnieuw abonneren', + 'subscribe' => 'Abonneren', + 'subscribe_help' => 'U bent momenteel geabonneerd en zult e-mailcommunicatie blijven ontvangen.', + 'unsubscribe_help' => 'U bent momenteel niet geabonneerd en ontvangt daarom op dit moment geen e-mails.', + 'notification_purchase_order_bounced' => 'We kunnen inkooporder :invoice niet leveren aan :contact .

:error', + 'notification_purchase_order_bounced_subject' => 'Kan inkooporder :invoice niet leveren', + 'show_pdfhtml_on_mobile' => 'Geef de HTML-versie van de entiteit weer bij weergave op mobiel', + 'show_pdfhtml_on_mobile_help' => 'Voor een betere visualisatie wordt een HTML-versie van de factuur/offerte weergegeven wanneer deze op mobiel wordt bekeken.', + 'please_select_an_invoice_or_credit' => 'Selecteer een factuur of tegoed', + 'mobile_version' => 'Mobiele versie', 'venmo' => 'Venmo', - 'my_bank' => 'MyBank', - 'pay_later' => 'Pay Later', - 'local_domain' => 'Local Domain', - 'verify_peer' => 'Verify Peer', - 'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key', - 'ar_detailed' => 'Accounts Receivable Detailed', - 'ar_summary' => 'Accounts Receivable Summary', - 'client_sales' => 'Client Sales', - 'user_sales' => 'User Sales', - 'iframe_url' => 'iFrame URL', - 'user_unsubscribed' => 'User unsubscribed from emails :link', + 'my_bank' => 'Mijn bank', + 'pay_later' => 'Betaal later', + 'local_domain' => 'Lokaal domein', + 'verify_peer' => 'Verifieer peer', + 'nordigen_help' => 'Let op: voor het koppelen van een account is een GoCardless/Nordigen API-sleutel vereist', + 'ar_detailed' => 'Debiteuren gedetailleerd', + 'ar_summary' => 'Overzicht debiteuren', + 'client_sales' => 'Verkoop van klanten', + 'user_sales' => 'Gebruikersverkoop', + 'iframe_url' => 'iFrame-URL', + 'user_unsubscribed' => 'Gebruiker heeft zich afgemeld voor e-mails :link', + 'use_available_payments' => 'Gebruik beschikbare betalingen', + 'test_email_sent' => 'E-mail succesvol verzonden', + 'gateway_type' => 'Gatewaytype', + 'save_template_body' => 'Wilt u deze importtoewijzing opslaan als sjabloon voor toekomstig gebruik?', + 'save_as_template' => 'Sjabloontoewijzing opslaan' ); return $lang; From 0fe895e862a845447c262fa769dc0670d960bd2a Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 8 Mar 2024 21:25:36 +1100 Subject: [PATCH 21/21] Typo --- VERSION.txt | 2 +- app/Export/CSV/BaseExport.php | 4 ++-- config/ninja.php | 4 ++-- lang/en/texts.php | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/VERSION.txt b/VERSION.txt index 723ac17de3a1..ca280fefc96f 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -5.8.33 \ No newline at end of file +5.8.34 \ No newline at end of file diff --git a/app/Export/CSV/BaseExport.php b/app/Export/CSV/BaseExport.php index 9806ba2f8c74..37e904d154c6 100644 --- a/app/Export/CSV/BaseExport.php +++ b/app/Export/CSV/BaseExport.php @@ -856,11 +856,11 @@ class BaseExport * Add Client Filter * * @param Builder $query - * @param string $clients + * @param mixed $clients * * @return Builder */ - protected function addClientFilter(Builder $query, string $clients): Builder + protected function addClientFilter(Builder $query, $clients): Builder { if(is_string($clients)) { $clients = explode(',', $clients); diff --git a/config/ninja.php b/config/ninja.php index a6e920678030..c381de3b6b2b 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.8.33'), - 'app_tag' => env('APP_TAG', '5.8.33'), + 'app_version' => env('APP_VERSION', '5.8.34'), + 'app_tag' => env('APP_TAG', '5.8.34'), '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 518c47eaffe1..b0f869bd3503 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -5201,7 +5201,7 @@ $lang = array( 'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready', 'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.', 'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected', - 'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Considder restarting the flow.', + 'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.', 'nordigen_handler_restart' => 'Restart flow.', 'nordigen_handler_return' => 'Return to application.', 'lang_Lao' => 'Lao',