From 9b4382b4518457f7451f02b545ed8189ade22c09 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 26 Nov 2023 18:38:06 +1100 Subject: [PATCH 1/7] Updates for decorators --- app/Export/Decorators/ClientDecorator.php | 33 ++--- app/Export/Decorators/ContactDecorator.php | 43 +++++- app/Export/Decorators/CreditDecorator.php | 106 +++++++++++++- app/Export/Decorators/ExpenseDecorator.php | 115 ++++++++++++++- app/Export/Decorators/InvoiceDecorator.php | 133 +++++++++++++++++- app/Export/Decorators/ProductDecorator.php | 54 ++++++- .../Decorators/PurchaseOrderDecorator.php | 28 +++- app/Export/Decorators/QuoteDecorator.php | 37 ++++- .../Decorators/RecurringInvoiceDecorator.php | 45 +++++- app/Export/Decorators/TaskDecorator.php | 89 +++++++++++- .../Decorators/VendorContactDecorator.php | 21 ++- app/Export/Decorators/VendorDecorator.php | 46 +++++- app/Models/Expense.php | 5 + app/Models/PurchaseOrder.php | 5 + 14 files changed, 725 insertions(+), 35 deletions(-) diff --git a/app/Export/Decorators/ClientDecorator.php b/app/Export/Decorators/ClientDecorator.php index 3af0cef27610..e05abac51b3a 100644 --- a/app/Export/Decorators/ClientDecorator.php +++ b/app/Export/Decorators/ClientDecorator.php @@ -141,35 +141,20 @@ class ClientDecorator extends Decorator implements DecoratorInterface ctrans("texts.{$client->classification}") ?? ''; } + public function status(Client $client) + { + if ($client->is_deleted) { + return ctrans('texts.deleted'); + } + if ($client->deleted_at) { + return ctrans('texts.archived'); + } - ////////contact details///////////////// - /* - public function phone(Client $client) { - + return ctrans('texts.active'); } - public function first_name(Client $client) { - } - public function last_name(Client $client) { - } - public function email(Client $client) { - - } - public function custom_value1(Client $client) { - - } - public function custom_value2(Client $client) { - - } - public function custom_value3(Client $client) { - - } - public function custom_value4(Client $client) { - - } - */ } diff --git a/app/Export/Decorators/ContactDecorator.php b/app/Export/Decorators/ContactDecorator.php index b6588ce44f34..deb5413b02f6 100644 --- a/app/Export/Decorators/ContactDecorator.php +++ b/app/Export/Decorators/ContactDecorator.php @@ -11,10 +11,51 @@ namespace App\Export\Decorators; +use App\Models\ClientContact; + class ContactDecorator implements DecoratorInterface { public function transform(string $key, mixed $entity): mixed { - return 'Payment Decorator'; + $contact = false; + + if($entity instanceof ClientContact) { + $contact = $entity; + } elseif($entity->contacts) { + $contact = $entity->contacts()->first(); + } + + if($contact && method_exists($this, $key)) { + return $this->{$key}($contact); + } + + return ''; + } + + public function phone(ClientContact $contact) { + return $contact->phone ?? ''; + } + public function first_name(ClientContact $contact) { + return $contact->first_name ?? ''; + } + public function last_name(ClientContact $contact) { + return $contact->last_name ?? ''; + } + public function email(ClientContact $contact) { + return $contact->email ?? ''; + } + public function custom_value1(ClientContact $contact) { + return $contact->custom_value1 ?? ''; + } + public function custom_value2(ClientContact $contact) { + return $contact->custom_value2 ?? ''; + } + public function custom_value3(ClientContact $contact) { + return $contact->custom_value3 ?? ''; + } + public function custom_value4(ClientContact $contact) { + return $contact->custom_value4 ?? ''; + } + } diff --git a/app/Export/Decorators/CreditDecorator.php b/app/Export/Decorators/CreditDecorator.php index 61dc464a60dc..bc7a689da9f7 100644 --- a/app/Export/Decorators/CreditDecorator.php +++ b/app/Export/Decorators/CreditDecorator.php @@ -11,10 +11,114 @@ namespace App\Export\Decorators; +use App\Models\Credit; + class CreditDecorator implements DecoratorInterface { public function transform(string $key, mixed $entity): mixed { - return 'Payment Decorator'; + $credit = false; + + if($entity instanceof Credit) { + $credit = $entity; + } elseif($entity->credit) { + $credit = $entity->credit; + } + + if($credit && method_exists($this, $key)) { + return $this->{$key}($credit); + } + + return ''; + } + + public function number(Credit $credit ) { + return $credit->number ?? ''; + } + public function amount(Credit $credit ) { + return $credit->amount ?? 0; + } + public function balance(Credit $credit ) { + return $credit->balance ?? 0; + } + public function paid_to_date(Credit $credit ) { + return $credit->paid_to_date ?? 0; + } + public function po_number(Credit $credit ) { + return $credit->po_number ?? ''; + } + public function date(Credit $credit ) { + return $credit->date ?? ''; + } + public function due_date(Credit $credit ) { + return $credit->due_date ?? ''; + } + public function terms(Credit $credit ) { + return $credit->terms ?? ''; + } + public function discount(Credit $credit ) { + return $credit->discount ?? 0; + } + public function footer(Credit $credit ) { + return $credit->footer ?? ''; + } + public function status(Credit $credit ) { + return $credit->stringStatus($credit->status_id); + } + public function public_notes(Credit $credit ) { + return $credit->public_notes ?? ''; + } + public function private_notes(Credit $credit ) { + return $credit->private_notes ?? ''; + } + public function uses_inclusive_taxes(Credit $credit ) { + return $credit->uses_inclusive_taxes ? ctrans('texts.yes') : ctrans('texts.no'); + } + public function is_amount_discount(Credit $credit ) { + return $credit->is_amount_discount ? ctrans('texts.yes') : ctrans('texts.no'); + } + public function partial(Credit $credit ) { + return $credit->partial ?? 0; + } + public function partial_due_date(Credit $credit ) { + return $credit->partial_due_date ?? ''; + } + public function custom_surcharge1(Credit $credit ) { + return $credit->custom_surcharge1 ?? 0; + } + public function custom_surcharge2(Credit $credit ) { + return $credit->custom_surcharge2 ?? 0; + } + public function custom_surcharge3(Credit $credit ) { + return $credit->custom_surcharge3 ?? 0; + } + public function custom_surcharge4(Credit $credit ) { + return $credit->custom_surcharge4 ?? 0; + } + public function custom_value1(Credit $credit ) { + return $credit->custom_value1 ?? ''; + } + public function custom_value2(Credit $credit ) { + return $credit->custom_value2 ?? ''; + } + public function custom_value3(Credit $credit ) { + return $credit->custom_value3 ?? ''; + } + public function custom_value4(Credit $credit ) { + return $credit->custom_value4 ?? ''; + } + public function exchange_rate(Credit $credit ) { + return $credit->exchange_rate ?? 0; + } + public function total_taxes(Credit $credit ) { + return $credit->total_taxes ?? 0; + } + public function assigned_user_id(Credit $credit ) { + return $credit->assigned_user ? $credit->assigned_user->present()->name(): ''; + } + public function user_id(Credit $credit ) { + return $credit->user ? $credit->user->present()->name(): ''; + } + } diff --git a/app/Export/Decorators/ExpenseDecorator.php b/app/Export/Decorators/ExpenseDecorator.php index 718a442855ac..e01b993a0482 100644 --- a/app/Export/Decorators/ExpenseDecorator.php +++ b/app/Export/Decorators/ExpenseDecorator.php @@ -11,10 +11,123 @@ namespace App\Export\Decorators; +use App\Models\Expense; + class ExpenseDecorator implements DecoratorInterface { public function transform(string $key, mixed $entity): mixed { - return 'Payment Decorator'; + $expense = false; + + if($entity instanceof Expense) { + $expense = $entity; + } elseif($entity->expense) { + $expense = $entity->expense; + } + + if($expense && method_exists($this, $key)) { + return $this->{$key}($expense); + } + + return ''; + } + + public function amount(Expense $expense) { + return $expense->amount ?? 0; + } + public function category_id(Expense $expense) { + return $expense->category ? $expense->category->name : ''; + } + public function client_id(Expense $expense) { + return $expense->client ? $expense->client->present()->name() : ''; + } + public function custom_value1(Expense $expense) { + return $expense->custom_value1 ?? ''; + } + public function custom_value2(Expense $expense) { + return $expense->custom_value2 ?? ''; + } + public function custom_value3(Expense $expense) { + return $expense->custom_value3 ?? ''; + } + public function custom_value4(Expense $expense) { + return $expense->custom_value4 ?? ''; + } + public function currency_id(Expense $expense) { + return $expense->currency ? $expense->currency->code : $expense->company->currency()->code; + } + public function date(Expense $expense) { + return $expense->date ?? ''; + } + public function exchange_rate(Expense $expense) { + return $expense->exchange_rate ?? 0; + } + public function foreign_amount(Expense $expense) { + return $expense->foreign_amount ?? 0; + } + public function invoice_currency_id(Expense $expense) { + return $expense->invoice_currency ? $expense->invoice_currency->code : $expense->company->currency()->code; + } + public function payment_date(Expense $expense) { + return $expense->payment_date ?? ''; + } + public function number(Expense $expense) { + return $expense->number ?? ''; + } + public function payment_type_id(Expense $expense) { + return $expense->payment_type ? $expense->payment_type->name : ''; + } + public function private_notes(Expense $expense) { + return $expense->private_notes ?? ''; + } + public function project_id(Expense $expense) { + return $expense->project ? $expense->project->name : ''; + } + public function public_notes(Expense $expense) { + return $expense->public_notes ?? ''; + } + public function tax_amount1(Expense $expense) { + return $expense->tax_amount1 ?? 0; + } + public function tax_amount2(Expense $expense) { + return $expense->tax_amount2 ?? 0; + } + public function tax_amount3(Expense $expense) { + return $expense->tax_amount3 ?? 0; + } + public function tax_name1(Expense $expense) { + return $expense->tax_name1 ?? ''; + } + public function tax_name2(Expense $expense) { + return $expense->tax_name2 ?? ''; + } + public function tax_name3(Expense $expense) { + return $expense->tax_name3 ?? ''; + } + public function tax_rate1(Expense $expense) { + return $expense->tax_rate1 ?? 0; + } + public function tax_rate2(Expense $expense) { + return $expense->tax_rate2 ?? 0; + } + public function tax_rate3(Expense $expense) { + return $expense->tax_rate3 ?? 0; + } + public function transaction_reference(Expense $expense) { + return $expense->transaction_reference ?? ''; + } + public function vendor_id(Expense $expense) { + return $expense->vendor ? $expense->vendor->name : ''; + } + public function invoice_id(Expense $expense) { + return $expense->invoice ? $expense->invoice->number : ''; + } + public function user(Expense $expense) { + return $expense->user ? $expense->user->present()->name() : ''; + } + public function assigned_user(Expense $expense) { + return $expense->assigned_user ? $expense->assigned_user->present()->name() : ''; + } + } diff --git a/app/Export/Decorators/InvoiceDecorator.php b/app/Export/Decorators/InvoiceDecorator.php index f3eb80c4c823..1865a9876837 100644 --- a/app/Export/Decorators/InvoiceDecorator.php +++ b/app/Export/Decorators/InvoiceDecorator.php @@ -11,10 +11,141 @@ namespace App\Export\Decorators; +use App\Models\Invoice; + class InvoiceDecorator extends Decorator implements DecoratorInterface { public function transform(string $key, mixed $entity): mixed { - return 'Payment Decorator'; + $invoice = false; + + if($entity instanceof Invoice) { + $invoice = $entity; + } elseif($entity->invoice) { + $invoice = $entity->invoice; + } + + if($invoice && method_exists($this, $key)) { + return $this->{$key}($invoice); + } + + return ''; + } + + + public function number(Invoice $invoice) { + return $invoice->number ?? ''; + } + public function amount(Invoice $invoice) { + return $invoice->amount ?? 0; + } + public function balance(Invoice $invoice) { + return $invoice->balance ?? 0; + } + public function paid_to_date(Invoice $invoice) { + return $invoice->paid_to_date ?? 0; + } + public function po_number(Invoice $invoice) { + return $invoice->po_number ?? ''; + } + public function date(Invoice $invoice) { + return $invoice->date ?? ''; + } + public function due_date(Invoice $invoice) { + return $invoice->due_date ?? ''; + } + public function terms(Invoice $invoice) { + return $invoice->terms ?? ''; + } + public function footer(Invoice $invoice) { + return $invoice->footer ?? ''; + } + public function status(Invoice $invoice) { + return $invoice->stringStatus($invoice->status_id); + } + public function public_notes(Invoice $invoice) { + return $invoice->public_notes ?? ''; + } + public function private_notes(Invoice $invoice) { + return $invoice->private_notes ?? ''; + } + public function uses_inclusive_taxes(Invoice $invoice) { + return $invoice->uses_inclusive_taxes ? ctrans('texts.yes') : ctrans('texts.no'); + } + public function is_amount_discount(Invoice $invoice) { + return $invoice->is_amount_discount ? ctrans('texts.yes') : ctrans('texts.no'); + } + public function discount(Invoice $invoice) { + return $invoice->discount ?? 0; + } + public function partial(Invoice $invoice) { + return $invoice->partial ?? 0; + } + public function partial_due_date(Invoice $invoice) { + return $invoice->partial_due_date ?? ''; + } + public function custom_surcharge1(Invoice $invoice) { + return $invoice->custom_surcharge1 ?? 0; + } + public function custom_surcharge2(Invoice $invoice) { + return $invoice->custom_surcharge2 ?? 0; + } + public function custom_surcharge3(Invoice $invoice) { + return $invoice->custom_surcharge3 ?? 0; + } + public function custom_surcharge4(Invoice $invoice) { + return $invoice->custom_surcharge4 ?? 0; + } + public function exchange_rate(Invoice $invoice) { + return $invoice->exchange_rate ?? 0; + } + public function total_taxes(Invoice $invoice) { + return $invoice->total_taxes ?? 0; + } + public function assigned_user_id(Invoice $invoice) { + return $invoice->assigned_user ? $invoice->assigned_user->present()->name(): ''; + } + public function user_id(Invoice $invoice) { + return $invoice->user ? $invoice->user->present()->name(): ''; + } + public function custom_value1(Invoice $invoice) { + return $invoice->custom_value1 ?? ''; + } + public function custom_value2(Invoice $invoice) { + return $invoice->custom_value2 ?? ''; + } + public function custom_value3(Invoice $invoice) { + return $invoice->custom_value3 ?? ''; + } + public function custom_value4(Invoice $invoice) { + return $invoice->custom_value4 ?? ''; + } + public function tax_name1(Invoice $invoice) { + return $invoice->tax_name1 ?? ''; + } + public function tax_name2(Invoice $invoice) { + return $invoice->tax_name2 ?? ''; + } + public function tax_name3(Invoice $invoice) { + return $invoice->tax_name3 ?? ''; + } + public function tax_rate1(Invoice $invoice) { + return $invoice->tax_rate1 ?? 0; + } + public function tax_rate2(Invoice $invoice) { + return $invoice->tax_rate2 ?? 0; + } + public function tax_rate3(Invoice $invoice) { + return $invoice->tax_rate3 ?? 0; + } + public function recurring_id(Invoice $invoice) { + return $invoice->recurring_invoice ? $invoice->recurring_invoice->number : ''; + } + public function auto_bill_enabled(Invoice $invoice) { + return $invoice->auto_bill_enabled ? ctrans('texts.yes') : ctrans('texts.no'); + } + } + + diff --git a/app/Export/Decorators/ProductDecorator.php b/app/Export/Decorators/ProductDecorator.php index d7b9fc729525..5f99d8414400 100644 --- a/app/Export/Decorators/ProductDecorator.php +++ b/app/Export/Decorators/ProductDecorator.php @@ -11,10 +11,62 @@ namespace App\Export\Decorators; +use App\Models\Product; + class ProductDecorator implements DecoratorInterface { public function transform(string $key, mixed $entity): mixed { - return 'Payment Decorator'; + $product = false; + + if($entity instanceof Product) { + $product = $entity; + } elseif($entity->product) { + $product = $entity->product; + } + + if($product && method_exists($this, $key)) { + return $this->{$key}($product); + } + elseif($product->{$key}) + return $product->{$key} ?? ''; + + return ''; + } + + /* + public const PRODUCT_TYPE_PHYSICAL = 1; + public const PRODUCT_TYPE_SERVICE = 2; + public const PRODUCT_TYPE_DIGITAL = 3; + public const PRODUCT_TYPE_SHIPPING = 4; + public const PRODUCT_TYPE_EXEMPT = 5; + public const PRODUCT_TYPE_REDUCED_TAX = 6; + public const PRODUCT_TYPE_OVERRIDE_TAX = 7; + public const PRODUCT_TYPE_ZERO_RATED = 8; + public const PRODUCT_TYPE_REVERSE_TAX = 9; + */ + public function tax_category(Product $product) { + + $category = ctrans('texts.physical_goods'); + + match($product->tax_id){ + 1 => $category = ctrans('texts.physical_goods'), + 2 => $category = ctrans('texts.services'), + 3 => $category = ctrans('texts.digital_products'), + 4 => $category = ctrans('texts.shipping'), + 5 => $category = ctrans('texts.tax_exempt'), + 6 => $category = ctrans('texts.reduced_tax'), + 7 => $category = ctrans('texts.override_tax'), + 8 => $category = ctrans('texts.zero_rated'), + 9 => $category = ctrans('texts.reverse_tax'), + default => $category = ctrans('texts.physical_goods'), + }; + + return $category; + } + } + + + diff --git a/app/Export/Decorators/PurchaseOrderDecorator.php b/app/Export/Decorators/PurchaseOrderDecorator.php index b25f7001d555..e87df1f02226 100644 --- a/app/Export/Decorators/PurchaseOrderDecorator.php +++ b/app/Export/Decorators/PurchaseOrderDecorator.php @@ -11,10 +11,36 @@ namespace App\Export\Decorators; +use App\Models\PurchaseOrder; + class PurchaseOrderDecorator extends Decorator implements DecoratorInterface { public function transform(string $key, mixed $entity): mixed { - return 'Payment Decorator'; + $purchase_order = false; + + if($entity instanceof PurchaseOrder) { + $purchase_order = $entity; + } elseif($entity->purchase_order) { + $purchase_order = $entity->purchase_order; + } + + if($purchase_order && method_exists($this, $key)) { + return $this->{$key}($purchase_order); + } + elseif($purchase_order->{$key}) + return $purchase_order->{$key} ?? ''; + + return ''; + } + + public function status(PurchaseOrder $purchase_order) { + return $purchase_order->stringStatus($purchase_order->status_id); + } + + public function currency_id(PurchaseOrder $purchase_order) { + return $purchase_order->currency ? $purchase_order->currency->code : $purchase_order->company->currency()->code; + } + } diff --git a/app/Export/Decorators/QuoteDecorator.php b/app/Export/Decorators/QuoteDecorator.php index 49e073452c6f..24e5297bc6e1 100644 --- a/app/Export/Decorators/QuoteDecorator.php +++ b/app/Export/Decorators/QuoteDecorator.php @@ -11,10 +11,45 @@ namespace App\Export\Decorators; +use App\Models\Quote; + class QuoteDecorator extends Decorator implements DecoratorInterface { public function transform(string $key, mixed $entity): mixed { - return 'Payment Decorator'; + $quote = false; + + if($entity instanceof Quote) { + $quote = $entity; + } elseif($entity->quote) { + $quote = $entity->quote; + } + + if($quote && method_exists($this, $key)) { + return $this->{$key}($quote); + } elseif($quote->{$key}) { + return $quote->{$key} ?? ''; + } + + return ''; + } + + public function status(Quote $quote) { + return $quote->stringStatus($quote->status_id); + } + public function uses_inclusive_taxes(Quote $quote) { + return $quote->uses_inclusive_taxes ? ctrans('texts.yes') : ctrans('texts.no'); + } + public function is_amount_discount(Quote $quote) { + return $quote->is_amount_discount ? ctrans('texts.yes') : ctrans('texts.no'); + } + public function assigned_user_id(Quote $quote) { + return $quote->assigned_user ? $quote->assigned_user->present()->name() : ''; + } + public function user_id(Quote $quote) { + return $quote->user->present()->name(); + } + } + diff --git a/app/Export/Decorators/RecurringInvoiceDecorator.php b/app/Export/Decorators/RecurringInvoiceDecorator.php index 02cd646b5d17..b32bda1456cf 100644 --- a/app/Export/Decorators/RecurringInvoiceDecorator.php +++ b/app/Export/Decorators/RecurringInvoiceDecorator.php @@ -11,10 +11,53 @@ namespace App\Export\Decorators; +use App\Models\RecurringInvoice; + class RecurringInvoiceDecorator extends Decorator implements DecoratorInterface { public function transform(string $key, mixed $entity): mixed { - return 'Payment Decorator'; + $recurring_invoice = false; + + if($entity instanceof RecurringInvoice) { + $recurring_invoice = $entity; + } elseif($entity->recurring_invoice) { + $recurring_invoice = $entity->recurring_invoice; + } + + if($recurring_invoice && method_exists($this, $key)) { + return $this->{$key}($recurring_invoice); + } elseif($recurring_invoice->{$key}) { + return $recurring_invoice->{$key} ?? ''; + } + + return ''; + } + + public function status(RecurringInvoice $recurring_invoice) { + return $recurring_invoice->stringStatus($recurring_invoice->status_id); + } + public function uses_inclusive_taxes(RecurringInvoice $recurring_invoice) { + return $recurring_invoice->uses_inclusive_taxes ? ctrans('texts.yes') : ctrans('texts.no'); + } + public function is_amount_discount(RecurringInvoice $recurring_invoice) { + return $recurring_invoice->is_amount_discount ? ctrans('texts.yes') : ctrans('texts.no'); + } + public function assigned_user_id(RecurringInvoice $recurring_invoice) { + return $recurring_invoice->assigned_user ? $recurring_invoice->assigned_user->present()->name() : ''; + } + public function user_id(RecurringInvoice $recurring_invoice) { + return $recurring_invoice->user->present()->name() ?? ''; + } + public function frequency_id(RecurringInvoice $recurring_invoice) { + return $recurring_invoice->frequency_id ? $recurring_invoice->frequencyForKey($recurring_invoice->frequency_id) : ''; + } + public function auto_bill(RecurringInvoice $recurring_invoice) { + return $recurring_invoice->auto_bill ? ctrans("texts.{$recurring_invoice->auto_bill}") : ''; + } + public function auto_bill_enabled(RecurringInvoice $recurring_invoice) { + return $recurring_invoice->auto_bill_enabled ? ctrans('texts.yes') : ctrans('texts.no'); + } + } diff --git a/app/Export/Decorators/TaskDecorator.php b/app/Export/Decorators/TaskDecorator.php index a6f8254c666b..7c51c2a6629d 100644 --- a/app/Export/Decorators/TaskDecorator.php +++ b/app/Export/Decorators/TaskDecorator.php @@ -11,10 +11,97 @@ namespace App\Export\Decorators; +use Carbon\Carbon; +use App\Models\Task; +use App\Models\Timezone; +use App\Models\DateFormat; + class TaskDecorator extends Decorator implements DecoratorInterface { public function transform(string $key, mixed $entity): mixed { - return 'Payment Decorator'; + $task = false; + + if($entity instanceof Task) { + $task = $entity; + } elseif($entity->task) { + $task = $entity->task; + } + + if($task && method_exists($this, $key)) { + return $this->{$key}($task); + } elseif($task->{$key}) { + return $task->{$key} ?? ''; + } + + return ''; + } + + public function start_date(Task $task){ + + $timezone = Timezone::find($task->company->settings->timezone_id); + $timezone_name = 'US/Eastern'; + + if ($timezone) { + $timezone_name = $timezone->name; + } + + $logs = json_decode($task->time_log, 1); + + $date_format_default = 'Y-m-d'; + + $date_format = DateFormat::find($task->company->settings->date_format_id); + + if ($date_format) { + $date_format_default = $date_format->format; + } + + if(is_array($logs)){ + $item = $logs[0]; + return Carbon::createFromTimeStamp($item[0])->setTimezone($timezone_name)->format($date_format_default); + } + + return ''; + + } + + public function end_date(Task $task){ + + $timezone = Timezone::find($task->company->settings->timezone_id); + $timezone_name = 'US/Eastern'; + + if ($timezone) { + $timezone_name = $timezone->name; + } + + $logs = json_decode($task->time_log, 1); + + $date_format_default = 'Y-m-d'; + + $date_format = DateFormat::find($task->company->settings->date_format_id); + + if ($date_format) { + $date_format_default = $date_format->format; + } + + if(is_array($logs)) { + $item = $logs[1]; + return Carbon::createFromTimeStamp($item[1])->setTimezone($timezone_name)->format($date_format_default); + } + + return ''; + + } + public function duration(Task $task){ + return $task->calcDuration(); + } + public function status_id(Task $task){ + return $task->status()->exists() ? $task->status->name : ''; + } + public function project_id(Task $task){ + return $task->project()->exists() ? $task->project->name : ''; + } + + } diff --git a/app/Export/Decorators/VendorContactDecorator.php b/app/Export/Decorators/VendorContactDecorator.php index 0e1b1d26ad01..70b90de45353 100644 --- a/app/Export/Decorators/VendorContactDecorator.php +++ b/app/Export/Decorators/VendorContactDecorator.php @@ -11,10 +11,29 @@ namespace App\Export\Decorators; +use App\Models\VendorContact; + class VendorContactDecorator implements DecoratorInterface { public function transform(string $key, mixed $entity): mixed { - return 'Payment Decorator'; + $contact = false; + + if($entity instanceof VendorContact) { + $contact = $entity; + } elseif($entity->contacts) { + $contact = $entity->contacts()->first(); + } + + if($contact && method_exists($this, $key)) { + return $this->{$key}($contact); + } + elseif($contact->{$key}) + return $contact->{$key} ?? ''; + + return ''; + } + + } diff --git a/app/Export/Decorators/VendorDecorator.php b/app/Export/Decorators/VendorDecorator.php index cafdd420addf..b31abbf2ccbe 100644 --- a/app/Export/Decorators/VendorDecorator.php +++ b/app/Export/Decorators/VendorDecorator.php @@ -11,10 +11,54 @@ namespace App\Export\Decorators; +use App\Models\Vendor; + class VendorDecorator extends Decorator implements DecoratorInterface { public function transform(string $key, mixed $entity): mixed { - return 'Payment Decorator'; + $vendor = false; + + if($entity instanceof Vendor) { + $vendor = $entity; + } elseif($entity->vendor) { + $vendor = $entity->vendor; + } + + if($vendor && method_exists($this, $key)) { + return $this->{$key}($vendor); + } elseif($vendor->{$key}) { + return $vendor->{$key} ?? ''; + } + + return ''; + } + + public function country_id(Vendor $vendor){ + return $vendor->country ? $vendor->country->name : ''; + } + public function name(Vendor $vendor){ + return $vendor->present()->name(); + } + public function currency(Vendor $vendor){ + return $vendor->currency_id ? $vendor->currency()->code : $vendor->company->currency()->code; + } + public function classification(Vendor $vendor) { + ctrans("texts.{$vendor->classification}") ?? ''; + } + + public function status(Vendor $vendor) + { + if ($vendor->is_deleted) { + return ctrans('texts.deleted'); + } + + if ($vendor->deleted_at) { + return ctrans('texts.archived'); + } + + return ctrans('texts.active'); + } + } diff --git a/app/Models/Expense.php b/app/Models/Expense.php index fa7078a8418a..95be95a9123f 100644 --- a/app/Models/Expense.php +++ b/app/Models/Expense.php @@ -203,6 +203,11 @@ class Expense extends BaseModel return $this->belongsTo(Currency::class); } + public function invoice_currency(): \Illuminate\Database\Eloquent\Relations\BelongsTo + { + return $this->belongsTo(Currency::class); + } + public function category(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(ExpenseCategory::class)->withTrashed(); diff --git a/app/Models/PurchaseOrder.php b/app/Models/PurchaseOrder.php index 15cf1faff44a..45dc8dc68181 100644 --- a/app/Models/PurchaseOrder.php +++ b/app/Models/PurchaseOrder.php @@ -269,6 +269,11 @@ class PurchaseOrder extends BaseModel return $this->belongsTo(Client::class)->withTrashed(); } + public function currency(): \Illuminate\Database\Eloquent\Relations\BelongsTo + { + return $this->belongsTo(Currency::class); + } + public function markInvitationsSent(): void { $this->invitations->each(function ($invitation) { From f7340d6114ecd4892efafb483dc7c3330b08f905 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 26 Nov 2023 18:41:42 +1100 Subject: [PATCH 2/7] PHP CS Fixer --- _ide_helper_custom.php | 2 +- app/Console/Commands/CheckData.php | 1 - app/Console/Commands/CreateSingleAccount.php | 91 ++- app/Console/Commands/MobileLocalization.php | 2 +- app/DataMapper/Tax/BaseRule.php | 2 +- app/Exceptions/Handler.php | 4 +- app/Export/CSV/BaseExport.php | 2 +- app/Export/CSV/ClientExport.php | 16 +- app/Export/CSV/PaymentExport.php | 10 +- app/Export/Decorators/ClientDecorator.php | 305 +++++---- app/Export/Decorators/ContactDecorator.php | 24 +- app/Export/Decorators/CreditDecorator.php | 87 ++- app/Export/Decorators/Decorator.php | 18 +- app/Export/Decorators/DecoratorInterface.php | 3 +- app/Export/Decorators/ExpenseDecorator.php | 96 ++- app/Export/Decorators/InvoiceDecorator.php | 262 ++++---- app/Export/Decorators/PaymentDecorator.php | 87 ++- app/Export/Decorators/ProductDecorator.php | 12 +- .../Decorators/PurchaseOrderDecorator.php | 12 +- app/Export/Decorators/QuoteDecorator.php | 20 +- .../Decorators/RecurringInvoiceDecorator.php | 31 +- app/Export/Decorators/TaskDecorator.php | 23 +- .../Decorators/VendorContactDecorator.php | 6 +- app/Export/Decorators/VendorDecorator.php | 15 +- app/Factory/CompanyFactory.php | 12 +- app/Filters/CreditFilters.php | 14 +- app/Http/Controllers/Auth/LoginController.php | 5 +- app/Http/Controllers/ClientController.php | 54 +- .../ClientPortal/InvitationController.php | 2 +- .../ClientPortal/InvoiceController.php | 1 - .../Controllers/CompanyGatewayController.php | 8 +- app/Http/Controllers/CreditController.php | 44 +- app/Http/Controllers/EmailController.php | 3 +- app/Http/Controllers/ExpenseController.php | 28 +- app/Http/Controllers/InvoiceController.php | 2 +- app/Http/Controllers/PaymentController.php | 30 +- app/Http/Controllers/PreviewController.php | 46 +- .../PreviewPurchaseOrderController.php | 46 +- app/Http/Controllers/ProjectController.php | 24 +- .../Controllers/PurchaseOrderController.php | 40 +- app/Http/Controllers/QuoteController.php | 56 +- .../Reports/ARDetailReportController.php | 8 +- .../Reports/ARSummaryReportController.php | 8 +- .../Reports/ClientBalanceReportController.php | 8 +- .../Reports/ClientSalesReportController.php | 8 +- .../Reports/ProductSalesReportController.php | 10 +- .../Reports/ProfitAndLossController.php | 12 +- .../Reports/TaxSummaryReportController.php | 8 +- .../Reports/UserSalesReportController.php | 8 +- app/Http/Controllers/SubdomainController.php | 2 +- app/Http/Controllers/TaskController.php | 32 +- .../VendorPortal/PurchaseOrderController.php | 26 +- app/Http/Middleware/Locale.php | 4 +- app/Http/Middleware/VendorLocale.php | 86 +-- .../StoreCompanyGatewayRequest.php | 1 - .../Requests/Design/UpdateDesignRequest.php | 2 +- app/Http/Requests/Email/SendEmailRequest.php | 8 +- .../Requests/Invoice/BulkInvoiceRequest.php | 1 - .../Requests/Payment/StorePaymentRequest.php | 2 +- .../Preview/PreviewPurchaseOrderRequest.php | 8 +- app/Http/Requests/Task/StoreTaskRequest.php | 5 +- app/Import/Transformer/BaseTransformer.php | 5 +- .../Transformer/Csv/TaskTransformer.php | 24 +- app/Jobs/Company/CompanyImport.php | 22 +- app/Jobs/Company/CreateCompany.php | 1 - app/Jobs/Cron/UpdateCalculatedFields.php | 4 +- app/Jobs/Entity/CreateRawPdf.php | 35 +- app/Jobs/Expense/VendorExpenseNotify.php | 26 +- app/Jobs/Ledger/ClientLedgerBalanceUpdate.php | 2 +- app/Jobs/Ledger/UpdateLedger.php | 21 +- app/Jobs/Mail/NinjaMailerJob.php | 1 - app/Jobs/Ninja/SystemMaintenance.php | 2 +- app/Jobs/Payment/EmailPayment.php | 2 +- app/Jobs/PurchaseOrder/ZipPurchaseOrders.php | 16 +- app/Jobs/Report/PreviewReport.php | 5 +- app/Jobs/Util/Import.php | 18 +- app/Jobs/Util/VersionCheck.php | 28 +- app/Jobs/Vendor/CreatePurchaseOrderPdf.php | 38 +- app/Libraries/OAuth/Providers/Google.php | 4 +- app/Listeners/LogResponseReceived.php | 14 +- app/Mail/Engine/PurchaseOrderEmailEngine.php | 10 +- app/Models/Company.php | 19 +- app/Models/Document.php | 7 +- app/Models/Gateway.php | 2 +- app/Models/Task.php | 35 +- .../Authorize/AuthorizeCustomer.php | 2 +- app/PaymentDrivers/BaseDriver.php | 20 +- .../GoCardlessPaymentDriver.php | 2 +- .../PayPalPPCPPaymentDriver.php | 39 +- app/Repositories/ExpenseRepository.php | 32 +- app/Repositories/VendorRepository.php | 2 +- app/Services/Client/ClientService.php | 9 +- app/Services/Client/PaymentMethod.php | 34 +- app/Services/Client/Statement.php | 17 +- app/Services/Company/CompanyService.php | 11 +- app/Services/Email/Email.php | 14 +- app/Services/Email/EmailDefaults.php | 2 +- app/Services/Invoice/HandleCancellation.php | 2 +- app/Services/Ledger/LedgerService.php | 8 +- app/Services/Payment/RefundPayment.php | 2 +- app/Services/Pdf/PdfConfiguration.php | 2 +- app/Services/Pdf/PdfMock.php | 4 +- app/Services/Pdf/PdfService.php | 25 +- app/Services/Report/TaxSummaryReport.php | 3 +- .../Subscription/SubscriptionService.php | 4 +- app/Services/Template/TemplateAction.php | 2 +- app/Services/Template/TemplateService.php | 35 +- app/Services/Vendor/VendorService.php | 2 +- config/broadcasting.php | 6 +- config/database.php | 2 +- config/liap.php | 14 +- config/ninja.php | 8 +- database/factories/CompanyFactory.php | 4 +- database/factories/InvoiceFactory.php | 4 +- database/factories/QuoteFactory.php | 2 +- .../2022_16_12_54687_add_stripe_bacs.php | 8 +- .../2023_02_28_064453_update_designs.php | 9 +- ...56_add_visible_prop_to_companies_table.php | 12 +- ...3_add_payment_balance_to_clients_table.php | 10 +- ...72_add_e_invoice_type_to_clients_table.php | 7 +- ...d_proforma_flag_for_recurring_invoices.php | 3 +- ...1_053933_tax_calculations_for_invoices.php | 14 +- ...054758_add_client_is_exempt_from_taxes.php | 16 +- ...4_20_215159_drop_e_invoice_type_column.php | 3 +- .../2023_04_27_045639_add_kmher_language.php | 14 +- .../2023_05_03_023956_add_shopify_user_id.php | 12 +- ...ect_and_task_columns_for_company_model.php | 4 +- ...6_13_220252_add_hungarian_translations.php | 5 +- ..._123355_add_paypal_rest_payment_driver.php | 8 +- .../2023_07_06_063512_update_designs.php | 5 +- ...8_000314_add_french_swiss_translations.php | 15 +- ...2_074829_add_thai_baht_currency_symbol.php | 5 +- ..._214607_add_start_date_column_to_tasks.php | 5 +- ..._currency_format_for_indonesian_rupiah.php | 7 +- ...te_view_dashboard_permission_migration.php | 5 +- ..._address_to_purchase_order_invitations.php | 3 +- ...23_08_09_224955_add_nicaragua_currency.php | 3 +- ...add_client_and_company_classifications.php | 3 +- ...010_add_template_flag_to_designs_table.php | 3 +- ..._102220_add_language_id_to_users_table.php | 3 +- ...nd_meta_and_category_to_payments_table.php | 3 +- .../2023_10_10_083024_add_ariary_currency.php | 5 +- .../2023_10_15_204204_add_paypal_ppcp.php | 10 +- ...1415_add_user_notification_suppression.php | 7 +- database/seeders/RandomDataSeeder.php | 62 +- database/seeders/UsersTableSeeder.php | 2 +- lang/ar/texts.php | 6 +- lang/bg/texts.php | 6 +- lang/ca/texts.php | 6 +- lang/cs/texts.php | 6 +- lang/da/texts.php | 6 +- lang/de/texts.php | 6 +- lang/el/texts.php | 6 +- lang/en/texts.php | 6 +- lang/en_GB/texts.php | 6 +- lang/es/texts.php | 6 +- lang/es_ES/texts.php | 6 +- lang/et/texts.php | 6 +- lang/fa/texts.php | 6 +- lang/fi/texts.php | 6 +- lang/fr/texts.php | 6 +- lang/fr_CA/texts.php | 6 +- lang/fr_CH/texts.php | 6 +- lang/he/texts.php | 6 +- lang/hr/texts.php | 6 +- lang/hu/texts.php | 6 +- lang/it/texts.php | 6 +- lang/ja/texts.php | 6 +- lang/km_KH/texts.php | 6 +- lang/lt/texts.php | 6 +- lang/lv_LV/texts.php | 6 +- lang/mk_MK/texts.php | 6 +- lang/nb_NO/texts.php | 6 +- lang/nl/texts.php | 6 +- lang/pl/texts.php | 6 +- lang/pt_BR/texts.php | 6 +- lang/pt_PT/texts.php | 6 +- lang/ro/texts.php | 6 +- lang/ru_RU/texts.php | 6 +- lang/sk/texts.php | 6 +- lang/sl/texts.php | 6 +- lang/sq/texts.php | 6 +- lang/sr/texts.php | 6 +- lang/sv/texts.php | 6 +- lang/th/texts.php | 6 +- lang/tr_TR/texts.php | 6 +- lang/zh_TW/texts.php | 6 +- routes/api.php | 174 ++--- routes/client.php | 27 +- routes/console.php | 3 +- tests/Feature/ActivityApiTest.php | 8 +- .../Feature/Bank/BankTransactionRuleTest.php | 70 +- tests/Feature/Bank/BankTransactionTest.php | 14 +- tests/Feature/Bank/YodleeApiTest.php | 634 +++++++++--------- tests/Feature/BankTransactionApiTest.php | 8 +- tests/Feature/BankTransactionRuleApiTest.php | 30 +- tests/Feature/BaseApiTest.php | 4 +- tests/Feature/ClassificationTest.php | 6 +- tests/Feature/ClientPortal/CreditsTest.php | 4 +- tests/Feature/ClientTest.php | 88 +-- tests/Feature/CompanySettingsTest.php | 12 +- tests/Feature/CompanyTest.php | 22 +- tests/Feature/CreditTest.php | 2 +- tests/Feature/DesignApiTest.php | 13 +- tests/Feature/DocumentsApiTest.php | 6 +- tests/Feature/EInvoice/FacturaeTest.php | 116 ++-- tests/Feature/EInvoice/FatturaPATest.php | 2 +- tests/Feature/ExpenseApiTest.php | 8 +- tests/Feature/Export/ArDetailReportTest.php | 1 - tests/Feature/Export/ArSummaryReportTest.php | 1 - .../Export/ClientBalanceReportTest.php | 1 - .../Feature/Export/ClientSalesReportTest.php | 15 +- tests/Feature/Export/ReportApiTest.php | 8 +- .../Export/ReportCsvGenerationTest.php | 102 +-- tests/Feature/Export/ReportPreviewTest.php | 30 +- tests/Feature/Export/TaxSummaryReportTest.php | 1 - tests/Feature/Export/UserSalesReportTest.php | 20 +- tests/Feature/GroupSettingTest.php | 9 +- tests/Feature/Import/CSV/TaskImportTest.php | 21 +- tests/Feature/InvoiceEmailTest.php | 10 +- tests/Feature/InvoiceTest.php | 12 +- tests/Feature/LiveDesignTest.php | 10 +- tests/Feature/MultiPaymentDeleteTest.php | 4 +- tests/Feature/Ninja/PlanTest.php | 13 +- tests/Feature/PaymentTest.php | 126 ++-- tests/Feature/PaymentV2Test.php | 26 +- tests/Feature/Payments/DeletePaymentTest.php | 14 +- tests/Feature/ProductTest.php | 3 +- tests/Feature/PurchaseOrderTest.php | 21 +- tests/Feature/QuoteTest.php | 18 +- tests/Feature/RecurringExpenseApiTest.php | 28 +- tests/Feature/RecurringInvoiceTest.php | 14 +- tests/Feature/RefundTest.php | 38 +- tests/Feature/ReminderTest.php | 63 +- .../Feature/Scheduler/ScheduleEntityTest.php | 16 +- tests/Feature/Scheduler/SchedulerTest.php | 41 +- tests/Feature/Search/SearchApiTest.php | 9 +- tests/Feature/TaskApiTest.php | 30 +- tests/Feature/TaxRateApiTest.php | 7 +- tests/Feature/Template/TemplateTest.php | 118 ++-- tests/Feature/UpdatePaymentTest.php | 17 +- tests/Feature/UserTest.php | 24 +- tests/Feature/VendorApiTest.php | 20 +- tests/Feature/WebhookAPITest.php | 43 +- tests/Integration/CompanyLedgerTest.php | 22 +- tests/Integration/DTO/AccountSummaryTest.php | 2 +- tests/Integration/EventTest.php | 104 +-- .../Integration/FileUploadValidationTest.php | 3 +- tests/Integration/UpdateCompanyUserTest.php | 2 +- tests/MockAccountData.php | 94 +-- tests/MockUnitData.php | 14 +- tests/Pdf/PdfServiceTest.php | 6 +- tests/Pdf/PdfmockTest.php | 18 +- tests/TestCase.php | 1 - tests/Unit/ArrayFiltersTest.php | 70 +- tests/Unit/CheckDataTest.php | 22 +- tests/Unit/ClientSettingsTest.php | 16 +- tests/Unit/CompanyDocumentsTest.php | 52 +- tests/Unit/DatesTest.php | 12 +- tests/Unit/EInvoiceTest.php | 52 +- tests/Unit/InvoiceItemTest.php | 4 +- tests/Unit/InvoiceTest.php | 8 +- tests/Unit/LateFeeTest.php | 25 +- tests/Unit/PasswordTimeoutTest.php | 6 +- tests/Unit/PaymentTypeTest.php | 5 +- tests/Unit/RecurringDatesTest.php | 35 +- tests/Unit/RecurringExpenseCloneTest.php | 12 +- tests/Unit/Tax/EuTaxTest.php | 2 +- tests/Unit/Tax/SumTaxTest.php | 30 +- tests/Unit/Tax/TaxConfigTest.php | 11 +- tests/Unit/Tax/UsTaxTest.php | 355 +++++----- 271 files changed, 3072 insertions(+), 3060 deletions(-) diff --git a/_ide_helper_custom.php b/_ide_helper_custom.php index 57714df9b396..bfe7b673dd79 100644 --- a/_ide_helper_custom.php +++ b/_ide_helper_custom.php @@ -14,4 +14,4 @@ namespace Illuminate\Contracts\Mail return true; } } -} \ No newline at end of file +} diff --git a/app/Console/Commands/CheckData.php b/app/Console/Commands/CheckData.php index 859abe405cd7..202bbd554e50 100644 --- a/app/Console/Commands/CheckData.php +++ b/app/Console/Commands/CheckData.php @@ -12,7 +12,6 @@ namespace App\Console\Commands; use App; -use App\DataMapper\ClientSettings; use App\Factory\ClientContactFactory; use App\Factory\VendorContactFactory; use App\Jobs\Company\CreateCompanyToken; diff --git a/app/Console/Commands/CreateSingleAccount.php b/app/Console/Commands/CreateSingleAccount.php index df64204634eb..07a1355fb103 100644 --- a/app/Console/Commands/CreateSingleAccount.php +++ b/app/Console/Commands/CreateSingleAccount.php @@ -11,54 +11,53 @@ namespace App\Console\Commands; -use stdClass; -use Carbon\Carbon; -use Faker\Factory; -use App\Models\Task; -use App\Models\User; -use App\Utils\Ninja; -use App\Models\Quote; -use App\Models\Client; -use App\Models\Credit; -use App\Models\Vendor; +use App\DataMapper\ClientRegistrationFields; +use App\DataMapper\CompanySettings; +use App\DataMapper\FeesAndLimits; +use App\Events\Invoice\InvoiceWasCreated; +use App\Events\RecurringInvoice\RecurringInvoiceWasCreated; +use App\Factory\GroupSettingFactory; +use App\Factory\InvoiceFactory; +use App\Factory\InvoiceItemFactory; +use App\Factory\RecurringInvoiceFactory; +use App\Factory\SubscriptionFactory; +use App\Helpers\Invoice\InvoiceSum; +use App\Jobs\Company\CreateCompanyTaskStatuses; +use App\Libraries\MultiDB; use App\Models\Account; +use App\Models\BankIntegration; +use App\Models\BankTransaction; +use App\Models\BankTransactionRule; +use App\Models\Client; +use App\Models\ClientContact; use App\Models\Company; +use App\Models\CompanyGateway; +use App\Models\CompanyToken; use App\Models\Country; +use App\Models\Credit; use App\Models\Expense; -use App\Models\Gateway; use App\Models\Invoice; use App\Models\Product; use App\Models\Project; -use App\Models\TaxRate; -use App\Libraries\MultiDB; -use App\Models\TaskStatus; -use App\Models\CompanyToken; -use App\Models\ClientContact; -use App\Models\VendorContact; -use App\Models\CompanyGateway; -use App\Factory\InvoiceFactory; -use App\Models\BankIntegration; -use App\Models\BankTransaction; -use App\Utils\Traits\MakesHash; -use Illuminate\Console\Command; +use App\Models\Quote; use App\Models\RecurringInvoice; -use App\DataMapper\FeesAndLimits; -use App\DataMapper\CompanySettings; -use App\Factory\InvoiceItemFactory; -use App\Helpers\Invoice\InvoiceSum; -use App\Models\BankTransactionRule; -use App\Factory\GroupSettingFactory; -use App\Factory\SubscriptionFactory; -use Illuminate\Support\Facades\Hash; -use Illuminate\Support\Facades\Cache; -use App\Utils\Traits\GeneratesCounter; -use Illuminate\Support\Facades\Schema; +use App\Models\Task; +use App\Models\TaskStatus; +use App\Models\TaxRate; +use App\Models\User; +use App\Models\Vendor; +use App\Models\VendorContact; use App\Repositories\InvoiceRepository; -use App\Factory\RecurringInvoiceFactory; -use App\Events\Invoice\InvoiceWasCreated; -use App\DataMapper\ClientRegistrationFields; -use App\Jobs\Company\CreateCompanyTaskStatuses; -use App\Events\RecurringInvoice\RecurringInvoiceWasCreated; +use App\Utils\Ninja; +use App\Utils\Traits\GeneratesCounter; +use App\Utils\Traits\MakesHash; +use Carbon\Carbon; +use Faker\Factory; +use Illuminate\Console\Command; +use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\Hash; +use Illuminate\Support\Facades\Schema; +use stdClass; class CreateSingleAccount extends Command { @@ -508,7 +507,7 @@ class CreateSingleAccount extends Command private function createTask($client) { - $time_log = $this->createTimeLog(rand(1,20)); + $time_log = $this->createTimeLog(rand(1, 20)); $status = TaskStatus::where('company_id', $client->company_id)->get()->random(); return Task::factory()->create([ @@ -517,8 +516,8 @@ class CreateSingleAccount extends Command 'time_log' => $time_log, 'description' => $this->faker->paragraph, 'status_id' => $status->id ?? null, - 'number' => rand(10000,100000000), - 'rate' => rand(1,150), + 'number' => rand(10000, 100000000), + 'rate' => rand(1, 150), 'client_id' => $client->id ]); } @@ -537,7 +536,7 @@ class CreateSingleAccount extends Command Carbon::now()->addSeconds($min)->timestamp, Carbon::now()->addSeconds($min += $rando)->timestamp, $this->faker->sentence, - rand(0,1) === 0 ? false : true + rand(0, 1) === 0 ? false : true ]; $min += 300; @@ -552,9 +551,9 @@ class CreateSingleAccount extends Command 'user_id' => $client->user->id, 'company_id' => $client->company->id, 'client_id' => $client->id, - 'due_date' => now()->addSeconds(rand(100000,1000000))->format('Y-m-d'), - 'budgeted_hours' => rand(100,1000), - 'task_rate' => rand(1,200), + 'due_date' => now()->addSeconds(rand(100000, 1000000))->format('Y-m-d'), + 'budgeted_hours' => rand(100, 1000), + 'task_rate' => rand(1, 200), ]); for($x=0; $x < rand(2, 5); $x++) { diff --git a/app/Console/Commands/MobileLocalization.php b/app/Console/Commands/MobileLocalization.php index 6692c5281a84..3065ca27360c 100644 --- a/app/Console/Commands/MobileLocalization.php +++ b/app/Console/Commands/MobileLocalization.php @@ -63,7 +63,7 @@ class MobileLocalization extends Command { $resources =(array)$this->getResources(); - if(is_iterable($resources)){ + if(is_iterable($resources)) { foreach ($resources as $key => $val) { $transKey = "texts.{$key}"; if (trans($transKey) == $transKey) { diff --git a/app/DataMapper/Tax/BaseRule.php b/app/DataMapper/Tax/BaseRule.php index acb16f0e95c7..6cc552e5d217 100644 --- a/app/DataMapper/Tax/BaseRule.php +++ b/app/DataMapper/Tax/BaseRule.php @@ -219,7 +219,7 @@ class BaseRule implements RuleInterface try { $this->invoice->saveQuietly(); - }catch(\Exception $e) { + } catch(\Exception $e) { } } diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index e993581e5af2..a3fb052ec297 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -223,8 +223,8 @@ class Handler extends ExceptionHandler return response()->json(['message' => $exception->getMessage()], 500); } elseif ($exception instanceof ThrottleRequestsException && $request->expectsJson()) { return response()->json(['message'=>'Too many requests'], 429); - // } elseif ($exception instanceof FatalThrowableError && $request->expectsJson()) { - // return response()->json(['message'=>'Fatal error'], 500); //@deprecated + // } elseif ($exception instanceof FatalThrowableError && $request->expectsJson()) { + // return response()->json(['message'=>'Fatal error'], 500); //@deprecated } elseif ($exception instanceof AuthorizationException && $request->expectsJson()) { return response()->json(['message'=> $exception->getMessage()], 401); } elseif ($exception instanceof TokenMismatchException) { diff --git a/app/Export/CSV/BaseExport.php b/app/Export/CSV/BaseExport.php index 55b931550cf0..34c735789c33 100644 --- a/app/Export/CSV/BaseExport.php +++ b/app/Export/CSV/BaseExport.php @@ -760,7 +760,7 @@ class BaseExport return $transformed_payment[$column]; } elseif (array_key_exists(str_replace("payment.", "", $column), $transformed_payment)) { return $transformed_payment[$column]; - } + } // nlog("export: Could not resolve payment key: {$column}"); diff --git a/app/Export/CSV/ClientExport.php b/app/Export/CSV/ClientExport.php index 6579ed3f04fc..3eb0cf0de130 100644 --- a/app/Export/CSV/ClientExport.php +++ b/app/Export/CSV/ClientExport.php @@ -11,17 +11,17 @@ namespace App\Export\CSV; +use App\Export\Decorators\Decorator; +use App\Libraries\MultiDB; +use App\Models\Client; +use App\Models\Company; +use App\Transformers\ClientContactTransformer; +use App\Transformers\ClientTransformer; use App\Utils\Ninja; use App\Utils\Number; -use App\Models\Client; -use League\Csv\Writer; -use App\Models\Company; -use App\Libraries\MultiDB; -use Illuminate\Support\Facades\App; -use App\Export\Decorators\Decorator; -use App\Transformers\ClientTransformer; use Illuminate\Database\Eloquent\Builder; -use App\Transformers\ClientContactTransformer; +use Illuminate\Support\Facades\App; +use League\Csv\Writer; class ClientExport extends BaseExport { diff --git a/app/Export/CSV/PaymentExport.php b/app/Export/CSV/PaymentExport.php index 86ee229bfd5f..a74fe4c2eb4b 100644 --- a/app/Export/CSV/PaymentExport.php +++ b/app/Export/CSV/PaymentExport.php @@ -11,15 +11,15 @@ namespace App\Export\CSV; -use App\Utils\Ninja; -use League\Csv\Writer; +use App\Export\Decorators\Decorator; +use App\Libraries\MultiDB; use App\Models\Company; use App\Models\Payment; -use App\Libraries\MultiDB; -use Illuminate\Support\Facades\App; use App\Transformers\PaymentTransformer; +use App\Utils\Ninja; use Illuminate\Database\Eloquent\Builder; -use App\Export\Decorators\Decorator; +use Illuminate\Support\Facades\App; +use League\Csv\Writer; class PaymentExport extends BaseExport { diff --git a/app/Export/Decorators/ClientDecorator.php b/app/Export/Decorators/ClientDecorator.php index e05abac51b3a..6fb1b70b8486 100644 --- a/app/Export/Decorators/ClientDecorator.php +++ b/app/Export/Decorators/ClientDecorator.php @@ -21,10 +21,9 @@ class ClientDecorator extends Decorator implements DecoratorInterface { $client = false; - if($entity instanceof Client){ + if($entity instanceof Client) { $client = $entity; - } - elseif($entity->client) { + } elseif($entity->client) { $client = $entity->client; } @@ -35,126 +34,192 @@ class ClientDecorator extends Decorator implements DecoratorInterface return ''; } - public function name(Client $client) { - return $client->present()->name(); - } - public function number(Client $client) { - return $client->number ?? ''; - } - public function user(Client $client) { - return $client->user->present()->name(); - } - public function assigned_user(Client $client) { - return $client->assigned_user ? $client->user->present()->name() : ''; - } - public function balance(Client $client) { - return $client->balance ?? 0; - } - public function paid_to_date(Client $client) { - return $client->paid_to_date ?? 0; - } - public function currency_id(Client $client) { - return $client->currency() ? $client->currency()->code : $client->company->currency()->code; - } - public function website(Client $client) { - return $client->website ?? ''; - } - public function private_notes(Client $client) { - return $client->private_notes ?? ''; - } - public function industry_id(Client $client) { - return $client->industry ? ctrans("texts.industry_{$client->industry->name}") : ''; - } - public function size_id(Client $client) { - return $client->size ? ctrans("texts.size_{$client->size->name}") : ''; - } - public function phone(Client $client) { - return $client->phone ?? ''; - } - public function address1(Client $client) { - return $client->address1 ?? ''; - } - public function address2(Client $client) { - return $client->address2 ?? ''; - } - public function city(Client $client) { - return $client->city ?? ''; - } - public function state(Client $client) { - return $client->state ?? ''; - } - public function postal_code(Client $client) { - return $client->postal_code ?? ''; - } - public function country_id(Client $client) { - return $client->country ? ctrans("texts.country_{$client->country->name}") : ''; - } - public function shipping_address1(Client $client) { - return $client->shipping_address1 ?? ''; - } - public function shipping_address2(Client $client) { - return $client->shipping_address2 ?? ''; - } - public function shipping_city(Client $client) { - return $client->shipping_city ?? ''; - } - public function shipping_state(Client $client) { - return $client->shipping_state ?? ''; - } - public function shipping_postal_code(Client $client) { - return $client->shipping_postal_code ?? ''; - } - public function shipping_country_id(Client $client) { - return $client->shipping_country ? ctrans("texts.country_{$client->shipping_country->name}") : ''; - } - public function payment_terms(Client $client) { - return $client?->settings?->payment_terms ?? $client->company->settings->payment_terms; - } - public function vat_number(Client $client) { - return $client->vat_number ?? ''; - } - public function id_number(Client $client) { - return $client->id_number ?? ''; - } - public function public_notes(Client $client) { - return $client->public_notes ?? ''; - } - public function custom_value1(Client $client) { - return $client->custom_value1 ?? ''; - } - public function custom_value2(Client $client) { - return $client->custom_value2 ?? ''; - } - public function custom_value3(Client $client) { - return $client->custom_value3 ?? ''; - } - public function custom_value4(Client $client) { - return $client->custom_value4 ?? ''; - } - public function payment_balance(Client $client) { - return $client->payment_balance ?? 0; - } - public function credit_balance(Client $client) { - return $client->credit_balance ?? 0; - } - public function classification(Client $client) { - ctrans("texts.{$client->classification}") ?? ''; + public function name(Client $client) + { + return $client->present()->name(); + } + + public function number(Client $client) + { + return $client->number ?? ''; + } + + public function user(Client $client) + { + return $client->user->present()->name(); + } + + public function assigned_user(Client $client) + { + return $client->assigned_user ? $client->user->present()->name() : ''; + } + + public function balance(Client $client) + { + return $client->balance ?? 0; + } + + public function paid_to_date(Client $client) + { + return $client->paid_to_date ?? 0; + } + + public function currency_id(Client $client) + { + return $client->currency() ? $client->currency()->code : $client->company->currency()->code; + } + + public function website(Client $client) + { + return $client->website ?? ''; + } + + public function private_notes(Client $client) + { + return $client->private_notes ?? ''; + } + + public function industry_id(Client $client) + { + return $client->industry ? ctrans("texts.industry_{$client->industry->name}") : ''; + } + + public function size_id(Client $client) + { + return $client->size ? ctrans("texts.size_{$client->size->name}") : ''; + } + + public function phone(Client $client) + { + return $client->phone ?? ''; + } + + public function address1(Client $client) + { + return $client->address1 ?? ''; + } + + public function address2(Client $client) + { + return $client->address2 ?? ''; + } + + public function city(Client $client) + { + return $client->city ?? ''; + } + + public function state(Client $client) + { + return $client->state ?? ''; + } + + public function postal_code(Client $client) + { + return $client->postal_code ?? ''; + } + + public function country_id(Client $client) + { + return $client->country ? ctrans("texts.country_{$client->country->name}") : ''; + } + + public function shipping_address1(Client $client) + { + return $client->shipping_address1 ?? ''; + } + + public function shipping_address2(Client $client) + { + return $client->shipping_address2 ?? ''; + } + + public function shipping_city(Client $client) + { + return $client->shipping_city ?? ''; + } + + public function shipping_state(Client $client) + { + return $client->shipping_state ?? ''; + } + + public function shipping_postal_code(Client $client) + { + return $client->shipping_postal_code ?? ''; + } + + public function shipping_country_id(Client $client) + { + return $client->shipping_country ? ctrans("texts.country_{$client->shipping_country->name}") : ''; + } + + public function payment_terms(Client $client) + { + return $client?->settings?->payment_terms ?? $client->company->settings->payment_terms; + } + + public function vat_number(Client $client) + { + return $client->vat_number ?? ''; + } + + public function id_number(Client $client) + { + return $client->id_number ?? ''; + } + + public function public_notes(Client $client) + { + return $client->public_notes ?? ''; + } + + public function custom_value1(Client $client) + { + return $client->custom_value1 ?? ''; + } + + public function custom_value2(Client $client) + { + return $client->custom_value2 ?? ''; + } + + public function custom_value3(Client $client) + { + return $client->custom_value3 ?? ''; + } + + public function custom_value4(Client $client) + { + return $client->custom_value4 ?? ''; + } + + public function payment_balance(Client $client) + { + return $client->payment_balance ?? 0; + } + + public function credit_balance(Client $client) + { + return $client->credit_balance ?? 0; + } + + public function classification(Client $client) + { + ctrans("texts.{$client->classification}") ?? ''; + } + + public function status(Client $client) + { + if ($client->is_deleted) { + return ctrans('texts.deleted'); } - public function status(Client $client) - { - if ($client->is_deleted) { - return ctrans('texts.deleted'); - } - - if ($client->deleted_at) { - return ctrans('texts.archived'); - } - - return ctrans('texts.active'); + if ($client->deleted_at) { + return ctrans('texts.archived'); } - - + return ctrans('texts.active'); + } } diff --git a/app/Export/Decorators/ContactDecorator.php b/app/Export/Decorators/ContactDecorator.php index deb5413b02f6..ae8ba8e5dcfd 100644 --- a/app/Export/Decorators/ContactDecorator.php +++ b/app/Export/Decorators/ContactDecorator.php @@ -33,28 +33,36 @@ class ContactDecorator implements DecoratorInterface } - public function phone(ClientContact $contact) { + public function phone(ClientContact $contact) + { return $contact->phone ?? ''; } - public function first_name(ClientContact $contact) { + public function first_name(ClientContact $contact) + { return $contact->first_name ?? ''; } - public function last_name(ClientContact $contact) { + public function last_name(ClientContact $contact) + { return $contact->last_name ?? ''; } - public function email(ClientContact $contact) { + public function email(ClientContact $contact) + { return $contact->email ?? ''; } - public function custom_value1(ClientContact $contact) { + public function custom_value1(ClientContact $contact) + { return $contact->custom_value1 ?? ''; } - public function custom_value2(ClientContact $contact) { + public function custom_value2(ClientContact $contact) + { return $contact->custom_value2 ?? ''; } - public function custom_value3(ClientContact $contact) { + public function custom_value3(ClientContact $contact) + { return $contact->custom_value3 ?? ''; } - public function custom_value4(ClientContact $contact) { + public function custom_value4(ClientContact $contact) + { return $contact->custom_value4 ?? ''; } diff --git a/app/Export/Decorators/CreditDecorator.php b/app/Export/Decorators/CreditDecorator.php index bc7a689da9f7..67a6341c5769 100644 --- a/app/Export/Decorators/CreditDecorator.php +++ b/app/Export/Decorators/CreditDecorator.php @@ -33,91 +33,120 @@ class CreditDecorator implements DecoratorInterface } - public function number(Credit $credit ) { + public function number(Credit $credit) + { return $credit->number ?? ''; } - public function amount(Credit $credit ) { + public function amount(Credit $credit) + { return $credit->amount ?? 0; } - public function balance(Credit $credit ) { + public function balance(Credit $credit) + { return $credit->balance ?? 0; } - public function paid_to_date(Credit $credit ) { + public function paid_to_date(Credit $credit) + { return $credit->paid_to_date ?? 0; } - public function po_number(Credit $credit ) { + public function po_number(Credit $credit) + { return $credit->po_number ?? ''; } - public function date(Credit $credit ) { + public function date(Credit $credit) + { return $credit->date ?? ''; } - public function due_date(Credit $credit ) { + public function due_date(Credit $credit) + { return $credit->due_date ?? ''; } - public function terms(Credit $credit ) { + public function terms(Credit $credit) + { return $credit->terms ?? ''; } - public function discount(Credit $credit ) { + public function discount(Credit $credit) + { return $credit->discount ?? 0; } - public function footer(Credit $credit ) { + public function footer(Credit $credit) + { return $credit->footer ?? ''; } - public function status(Credit $credit ) { + public function status(Credit $credit) + { return $credit->stringStatus($credit->status_id); } - public function public_notes(Credit $credit ) { + public function public_notes(Credit $credit) + { return $credit->public_notes ?? ''; } - public function private_notes(Credit $credit ) { + public function private_notes(Credit $credit) + { return $credit->private_notes ?? ''; } - public function uses_inclusive_taxes(Credit $credit ) { + public function uses_inclusive_taxes(Credit $credit) + { return $credit->uses_inclusive_taxes ? ctrans('texts.yes') : ctrans('texts.no'); } - public function is_amount_discount(Credit $credit ) { + public function is_amount_discount(Credit $credit) + { return $credit->is_amount_discount ? ctrans('texts.yes') : ctrans('texts.no'); } - public function partial(Credit $credit ) { + public function partial(Credit $credit) + { return $credit->partial ?? 0; } - public function partial_due_date(Credit $credit ) { + public function partial_due_date(Credit $credit) + { return $credit->partial_due_date ?? ''; } - public function custom_surcharge1(Credit $credit ) { + public function custom_surcharge1(Credit $credit) + { return $credit->custom_surcharge1 ?? 0; } - public function custom_surcharge2(Credit $credit ) { + public function custom_surcharge2(Credit $credit) + { return $credit->custom_surcharge2 ?? 0; } - public function custom_surcharge3(Credit $credit ) { + public function custom_surcharge3(Credit $credit) + { return $credit->custom_surcharge3 ?? 0; } - public function custom_surcharge4(Credit $credit ) { + public function custom_surcharge4(Credit $credit) + { return $credit->custom_surcharge4 ?? 0; } - public function custom_value1(Credit $credit ) { + public function custom_value1(Credit $credit) + { return $credit->custom_value1 ?? ''; } - public function custom_value2(Credit $credit ) { + public function custom_value2(Credit $credit) + { return $credit->custom_value2 ?? ''; } - public function custom_value3(Credit $credit ) { + public function custom_value3(Credit $credit) + { return $credit->custom_value3 ?? ''; } - public function custom_value4(Credit $credit ) { + public function custom_value4(Credit $credit) + { return $credit->custom_value4 ?? ''; } - public function exchange_rate(Credit $credit ) { + public function exchange_rate(Credit $credit) + { return $credit->exchange_rate ?? 0; } - public function total_taxes(Credit $credit ) { + public function total_taxes(Credit $credit) + { return $credit->total_taxes ?? 0; } - public function assigned_user_id(Credit $credit ) { + public function assigned_user_id(Credit $credit) + { return $credit->assigned_user ? $credit->assigned_user->present()->name(): ''; } - public function user_id(Credit $credit ) { + public function user_id(Credit $credit) + { return $credit->user ? $credit->user->present()->name(): ''; } diff --git a/app/Export/Decorators/Decorator.php b/app/Export/Decorators/Decorator.php index 7891caa3594b..a551053fced8 100644 --- a/app/Export/Decorators/Decorator.php +++ b/app/Export/Decorators/Decorator.php @@ -11,22 +11,8 @@ namespace App\Export\Decorators; - -use App\Models\Task; -use App\Models\Quote; -use App\Models\Client; -use App\Models\Credit; -use App\Models\Vendor; -use App\Models\Expense; -use App\Models\Invoice; -use App\Models\Payment; -use App\Models\Product; -use App\Models\Project; -use App\Models\PurchaseOrder; -use App\Models\RecurringInvoice; -use App\Export\Decorators\DecoratorInterface; - -class Decorator implements DecoratorInterface{ +class Decorator implements DecoratorInterface +{ public function __construct() { diff --git a/app/Export/Decorators/DecoratorInterface.php b/app/Export/Decorators/DecoratorInterface.php index cd8b6fa03597..483732205384 100644 --- a/app/Export/Decorators/DecoratorInterface.php +++ b/app/Export/Decorators/DecoratorInterface.php @@ -11,6 +11,7 @@ namespace App\Export\Decorators; -interface DecoratorInterface { +interface DecoratorInterface +{ public function transform(string $key, mixed $entity): mixed; } diff --git a/app/Export/Decorators/ExpenseDecorator.php b/app/Export/Decorators/ExpenseDecorator.php index e01b993a0482..22bb798a4a7c 100644 --- a/app/Export/Decorators/ExpenseDecorator.php +++ b/app/Export/Decorators/ExpenseDecorator.php @@ -33,100 +33,132 @@ class ExpenseDecorator implements DecoratorInterface } - public function amount(Expense $expense) { + public function amount(Expense $expense) + { return $expense->amount ?? 0; } - public function category_id(Expense $expense) { + public function category_id(Expense $expense) + { return $expense->category ? $expense->category->name : ''; } - public function client_id(Expense $expense) { + public function client_id(Expense $expense) + { return $expense->client ? $expense->client->present()->name() : ''; } - public function custom_value1(Expense $expense) { + public function custom_value1(Expense $expense) + { return $expense->custom_value1 ?? ''; } - public function custom_value2(Expense $expense) { + public function custom_value2(Expense $expense) + { return $expense->custom_value2 ?? ''; } - public function custom_value3(Expense $expense) { + public function custom_value3(Expense $expense) + { return $expense->custom_value3 ?? ''; } - public function custom_value4(Expense $expense) { + public function custom_value4(Expense $expense) + { return $expense->custom_value4 ?? ''; } - public function currency_id(Expense $expense) { + public function currency_id(Expense $expense) + { return $expense->currency ? $expense->currency->code : $expense->company->currency()->code; } - public function date(Expense $expense) { + public function date(Expense $expense) + { return $expense->date ?? ''; } - public function exchange_rate(Expense $expense) { + public function exchange_rate(Expense $expense) + { return $expense->exchange_rate ?? 0; } - public function foreign_amount(Expense $expense) { + public function foreign_amount(Expense $expense) + { return $expense->foreign_amount ?? 0; } - public function invoice_currency_id(Expense $expense) { + public function invoice_currency_id(Expense $expense) + { return $expense->invoice_currency ? $expense->invoice_currency->code : $expense->company->currency()->code; } - public function payment_date(Expense $expense) { + public function payment_date(Expense $expense) + { return $expense->payment_date ?? ''; } - public function number(Expense $expense) { + public function number(Expense $expense) + { return $expense->number ?? ''; } - public function payment_type_id(Expense $expense) { + public function payment_type_id(Expense $expense) + { return $expense->payment_type ? $expense->payment_type->name : ''; } - public function private_notes(Expense $expense) { + public function private_notes(Expense $expense) + { return $expense->private_notes ?? ''; } - public function project_id(Expense $expense) { + public function project_id(Expense $expense) + { return $expense->project ? $expense->project->name : ''; } - public function public_notes(Expense $expense) { + public function public_notes(Expense $expense) + { return $expense->public_notes ?? ''; } - public function tax_amount1(Expense $expense) { + public function tax_amount1(Expense $expense) + { return $expense->tax_amount1 ?? 0; } - public function tax_amount2(Expense $expense) { + public function tax_amount2(Expense $expense) + { return $expense->tax_amount2 ?? 0; } - public function tax_amount3(Expense $expense) { + public function tax_amount3(Expense $expense) + { return $expense->tax_amount3 ?? 0; } - public function tax_name1(Expense $expense) { + public function tax_name1(Expense $expense) + { return $expense->tax_name1 ?? ''; } - public function tax_name2(Expense $expense) { + public function tax_name2(Expense $expense) + { return $expense->tax_name2 ?? ''; } - public function tax_name3(Expense $expense) { + public function tax_name3(Expense $expense) + { return $expense->tax_name3 ?? ''; } - public function tax_rate1(Expense $expense) { + public function tax_rate1(Expense $expense) + { return $expense->tax_rate1 ?? 0; } - public function tax_rate2(Expense $expense) { + public function tax_rate2(Expense $expense) + { return $expense->tax_rate2 ?? 0; } - public function tax_rate3(Expense $expense) { + public function tax_rate3(Expense $expense) + { return $expense->tax_rate3 ?? 0; } - public function transaction_reference(Expense $expense) { + public function transaction_reference(Expense $expense) + { return $expense->transaction_reference ?? ''; } - public function vendor_id(Expense $expense) { + public function vendor_id(Expense $expense) + { return $expense->vendor ? $expense->vendor->name : ''; } - public function invoice_id(Expense $expense) { + public function invoice_id(Expense $expense) + { return $expense->invoice ? $expense->invoice->number : ''; } - public function user(Expense $expense) { + public function user(Expense $expense) + { return $expense->user ? $expense->user->present()->name() : ''; } - public function assigned_user(Expense $expense) { + public function assigned_user(Expense $expense) + { return $expense->assigned_user ? $expense->assigned_user->present()->name() : ''; } diff --git a/app/Export/Decorators/InvoiceDecorator.php b/app/Export/Decorators/InvoiceDecorator.php index 1865a9876837..bea2f6678541 100644 --- a/app/Export/Decorators/InvoiceDecorator.php +++ b/app/Export/Decorators/InvoiceDecorator.php @@ -33,119 +33,153 @@ class InvoiceDecorator extends Decorator implements DecoratorInterface } - - public function number(Invoice $invoice) { - return $invoice->number ?? ''; - } - public function amount(Invoice $invoice) { - return $invoice->amount ?? 0; - } - public function balance(Invoice $invoice) { - return $invoice->balance ?? 0; - } - public function paid_to_date(Invoice $invoice) { - return $invoice->paid_to_date ?? 0; - } - public function po_number(Invoice $invoice) { - return $invoice->po_number ?? ''; - } - public function date(Invoice $invoice) { - return $invoice->date ?? ''; - } - public function due_date(Invoice $invoice) { - return $invoice->due_date ?? ''; - } - public function terms(Invoice $invoice) { - return $invoice->terms ?? ''; - } - public function footer(Invoice $invoice) { - return $invoice->footer ?? ''; - } - public function status(Invoice $invoice) { - return $invoice->stringStatus($invoice->status_id); - } - public function public_notes(Invoice $invoice) { - return $invoice->public_notes ?? ''; - } - public function private_notes(Invoice $invoice) { - return $invoice->private_notes ?? ''; - } - public function uses_inclusive_taxes(Invoice $invoice) { - return $invoice->uses_inclusive_taxes ? ctrans('texts.yes') : ctrans('texts.no'); - } - public function is_amount_discount(Invoice $invoice) { - return $invoice->is_amount_discount ? ctrans('texts.yes') : ctrans('texts.no'); - } - public function discount(Invoice $invoice) { - return $invoice->discount ?? 0; - } - public function partial(Invoice $invoice) { - return $invoice->partial ?? 0; - } - public function partial_due_date(Invoice $invoice) { - return $invoice->partial_due_date ?? ''; - } - public function custom_surcharge1(Invoice $invoice) { - return $invoice->custom_surcharge1 ?? 0; - } - public function custom_surcharge2(Invoice $invoice) { - return $invoice->custom_surcharge2 ?? 0; - } - public function custom_surcharge3(Invoice $invoice) { - return $invoice->custom_surcharge3 ?? 0; - } - public function custom_surcharge4(Invoice $invoice) { - return $invoice->custom_surcharge4 ?? 0; - } - public function exchange_rate(Invoice $invoice) { - return $invoice->exchange_rate ?? 0; - } - public function total_taxes(Invoice $invoice) { - return $invoice->total_taxes ?? 0; - } - public function assigned_user_id(Invoice $invoice) { - return $invoice->assigned_user ? $invoice->assigned_user->present()->name(): ''; - } - public function user_id(Invoice $invoice) { - return $invoice->user ? $invoice->user->present()->name(): ''; - } - public function custom_value1(Invoice $invoice) { - return $invoice->custom_value1 ?? ''; - } - public function custom_value2(Invoice $invoice) { - return $invoice->custom_value2 ?? ''; - } - public function custom_value3(Invoice $invoice) { - return $invoice->custom_value3 ?? ''; - } - public function custom_value4(Invoice $invoice) { - return $invoice->custom_value4 ?? ''; - } - public function tax_name1(Invoice $invoice) { - return $invoice->tax_name1 ?? ''; - } - public function tax_name2(Invoice $invoice) { - return $invoice->tax_name2 ?? ''; - } - public function tax_name3(Invoice $invoice) { - return $invoice->tax_name3 ?? ''; - } - public function tax_rate1(Invoice $invoice) { - return $invoice->tax_rate1 ?? 0; - } - public function tax_rate2(Invoice $invoice) { - return $invoice->tax_rate2 ?? 0; - } - public function tax_rate3(Invoice $invoice) { - return $invoice->tax_rate3 ?? 0; - } - public function recurring_id(Invoice $invoice) { - return $invoice->recurring_invoice ? $invoice->recurring_invoice->number : ''; - } - public function auto_bill_enabled(Invoice $invoice) { - return $invoice->auto_bill_enabled ? ctrans('texts.yes') : ctrans('texts.no'); - } + public function number(Invoice $invoice) + { + return $invoice->number ?? ''; + } + public function amount(Invoice $invoice) + { + return $invoice->amount ?? 0; + } + public function balance(Invoice $invoice) + { + return $invoice->balance ?? 0; + } + public function paid_to_date(Invoice $invoice) + { + return $invoice->paid_to_date ?? 0; + } + public function po_number(Invoice $invoice) + { + return $invoice->po_number ?? ''; + } + public function date(Invoice $invoice) + { + return $invoice->date ?? ''; + } + public function due_date(Invoice $invoice) + { + return $invoice->due_date ?? ''; + } + public function terms(Invoice $invoice) + { + return $invoice->terms ?? ''; + } + public function footer(Invoice $invoice) + { + return $invoice->footer ?? ''; + } + public function status(Invoice $invoice) + { + return $invoice->stringStatus($invoice->status_id); + } + public function public_notes(Invoice $invoice) + { + return $invoice->public_notes ?? ''; + } + public function private_notes(Invoice $invoice) + { + return $invoice->private_notes ?? ''; + } + public function uses_inclusive_taxes(Invoice $invoice) + { + return $invoice->uses_inclusive_taxes ? ctrans('texts.yes') : ctrans('texts.no'); + } + public function is_amount_discount(Invoice $invoice) + { + return $invoice->is_amount_discount ? ctrans('texts.yes') : ctrans('texts.no'); + } + public function discount(Invoice $invoice) + { + return $invoice->discount ?? 0; + } + public function partial(Invoice $invoice) + { + return $invoice->partial ?? 0; + } + public function partial_due_date(Invoice $invoice) + { + return $invoice->partial_due_date ?? ''; + } + public function custom_surcharge1(Invoice $invoice) + { + return $invoice->custom_surcharge1 ?? 0; + } + public function custom_surcharge2(Invoice $invoice) + { + return $invoice->custom_surcharge2 ?? 0; + } + public function custom_surcharge3(Invoice $invoice) + { + return $invoice->custom_surcharge3 ?? 0; + } + public function custom_surcharge4(Invoice $invoice) + { + return $invoice->custom_surcharge4 ?? 0; + } + public function exchange_rate(Invoice $invoice) + { + return $invoice->exchange_rate ?? 0; + } + public function total_taxes(Invoice $invoice) + { + return $invoice->total_taxes ?? 0; + } + public function assigned_user_id(Invoice $invoice) + { + return $invoice->assigned_user ? $invoice->assigned_user->present()->name(): ''; + } + public function user_id(Invoice $invoice) + { + return $invoice->user ? $invoice->user->present()->name(): ''; + } + public function custom_value1(Invoice $invoice) + { + return $invoice->custom_value1 ?? ''; + } + public function custom_value2(Invoice $invoice) + { + return $invoice->custom_value2 ?? ''; + } + public function custom_value3(Invoice $invoice) + { + return $invoice->custom_value3 ?? ''; + } + public function custom_value4(Invoice $invoice) + { + return $invoice->custom_value4 ?? ''; + } + public function tax_name1(Invoice $invoice) + { + return $invoice->tax_name1 ?? ''; + } + public function tax_name2(Invoice $invoice) + { + return $invoice->tax_name2 ?? ''; + } + public function tax_name3(Invoice $invoice) + { + return $invoice->tax_name3 ?? ''; + } + public function tax_rate1(Invoice $invoice) + { + return $invoice->tax_rate1 ?? 0; + } + public function tax_rate2(Invoice $invoice) + { + return $invoice->tax_rate2 ?? 0; + } + public function tax_rate3(Invoice $invoice) + { + return $invoice->tax_rate3 ?? 0; + } + public function recurring_id(Invoice $invoice) + { + return $invoice->recurring_invoice ? $invoice->recurring_invoice->number : ''; + } + public function auto_bill_enabled(Invoice $invoice) + { + return $invoice->auto_bill_enabled ? ctrans('texts.yes') : ctrans('texts.no'); + } } - - diff --git a/app/Export/Decorators/PaymentDecorator.php b/app/Export/Decorators/PaymentDecorator.php index f9af06b182c1..791d1c01848a 100644 --- a/app/Export/Decorators/PaymentDecorator.php +++ b/app/Export/Decorators/PaymentDecorator.php @@ -13,7 +13,8 @@ namespace App\Export\Decorators; use App\Models\Payment; -class PaymentDecorator extends Decorator implements DecoratorInterface{ +class PaymentDecorator extends Decorator implements DecoratorInterface +{ private $entity_key = 'payment'; @@ -21,20 +22,17 @@ class PaymentDecorator extends Decorator implements DecoratorInterface{ { $payment = false; - if($entity instanceof Payment){ + if($entity instanceof Payment) { $payment = $entity; - } - elseif($entity->payment) { + } elseif($entity->payment) { $payment = $entity->payment; } - if($key == 'amount' && (!$entity instanceof Payment)){ + if($key == 'amount' && (!$entity instanceof Payment)) { return $entity->payments()->exists() ? $entity->payments()->withoutTrashed()->sum('paymentables.amount') : ctrans('texts.unpaid'); - } - elseif($key == 'refunded' && (!$entity instanceof Payment)) { + } elseif($key == 'refunded' && (!$entity instanceof Payment)) { return $entity->payments()->exists() ? $entity->payments()->withoutTrashed()->sum('paymentables.refunded') : ''; - } - elseif($key == 'applied' && (!$entity instanceof Payment)) { + } elseif($key == 'applied' && (!$entity instanceof Payment)) { $refunded = $entity->payments()->withoutTrashed()->sum('paymentables.refunded'); $amount = $entity->payments()->withoutTrashed()->sum('paymentables.amount'); return $entity->payments()->withoutTrashed()->exists() ? ($amount - $refunded) : ''; @@ -47,96 +45,119 @@ class PaymentDecorator extends Decorator implements DecoratorInterface{ return ''; } - public function date(Payment $payment) { + public function date(Payment $payment) + { return $payment->date ?? ''; } - public function amount(Payment $payment) { + public function amount(Payment $payment) + { return $payment->amount ?? ''; } - public function refunded(Payment $payment) { + public function refunded(Payment $payment) + { return $payment->refunded ?? ''; } - public function applied(Payment $payment) { + public function applied(Payment $payment) + { return $payment->applied ?? ''; } - public function transaction_reference(Payment $payment) { + public function transaction_reference(Payment $payment) + { return $payment->transaction_reference ?? ''; } - public function currency(Payment $payment) { + public function currency(Payment $payment) + { return $payment->currency()->exists() ? $payment->currency->code : $payment->company->currency()->code; } - public function exchange_rate(Payment $payment) { + public function exchange_rate(Payment $payment) + { return $payment->exchange_rate ?? 1; } - public function number(Payment $payment) { + public function number(Payment $payment) + { return $payment->number ?? ''; } - public function method(Payment $payment) { + public function method(Payment $payment) + { return $payment->translatedType(); } - public function status(Payment $payment) { + public function status(Payment $payment) + { return $payment->stringStatus($payment->status_id); } - public function private_notes(Payment $payment) { + public function private_notes(Payment $payment) + { return strip_tags($payment->private_notes) ?? ''; } - public function custom_value1(Payment $payment) { + public function custom_value1(Payment $payment) + { return $payment->custom_value1 ?? ''; } - public function custom_value2(Payment $payment) { + public function custom_value2(Payment $payment) + { return $payment->custom_value2 ?? ''; } - public function custom_value3(Payment $payment) { + public function custom_value3(Payment $payment) + { return $payment->custom_value3 ?? ''; } - public function custom_value4(Payment $payment) { + public function custom_value4(Payment $payment) + { return $payment->custom_value4 ?? ''; } - public function user_id(Payment $payment) { + public function user_id(Payment $payment) + { return $payment->user ? $payment->user->present()->name() : ''; } - public function assigned_user_id(Payment $payment) { + public function assigned_user_id(Payment $payment) + { return $payment->assigned_user ? $payment->assigned_user->present()->name() : ''; } - public function project_id(Payment $payment) { + public function project_id(Payment $payment) + { return $payment->project()->exists() ? $payment->project->name : ''; } /////////////////////////////////////////////////// - public function vendor_id(Payment $payment){ + public function vendor_id(Payment $payment) + { return $payment->vendor()->exists() ? $payment->vendor->name : ''; } - public function exchange_currency(Payment $payment){ + public function exchange_currency(Payment $payment) + { return $payment->exchange_currency()->exists() ? $payment->exchange_currency->code : ''; } - public function gateway_type_id(Payment $payment) { + public function gateway_type_id(Payment $payment) + { return $payment->gateway_type ? $payment->gateway_type->name : 'Unknown Type'; } - public function client_id(Payment $payment) { + public function client_id(Payment $payment) + { return $payment->client->present()->name(); } - public function type_id(Payment $payment) { + public function type_id(Payment $payment) + { return $payment->translatedType(); } -} \ No newline at end of file +} diff --git a/app/Export/Decorators/ProductDecorator.php b/app/Export/Decorators/ProductDecorator.php index 5f99d8414400..ad0dc6b81e39 100644 --- a/app/Export/Decorators/ProductDecorator.php +++ b/app/Export/Decorators/ProductDecorator.php @@ -27,9 +27,9 @@ class ProductDecorator implements DecoratorInterface if($product && method_exists($this, $key)) { return $this->{$key}($product); - } - elseif($product->{$key}) + } elseif($product->{$key}) { return $product->{$key} ?? ''; + } return ''; @@ -46,11 +46,12 @@ class ProductDecorator implements DecoratorInterface public const PRODUCT_TYPE_ZERO_RATED = 8; public const PRODUCT_TYPE_REVERSE_TAX = 9; */ - public function tax_category(Product $product) { + public function tax_category(Product $product) + { $category = ctrans('texts.physical_goods'); - match($product->tax_id){ + match($product->tax_id) { 1 => $category = ctrans('texts.physical_goods'), 2 => $category = ctrans('texts.services'), 3 => $category = ctrans('texts.digital_products'), @@ -67,6 +68,3 @@ class ProductDecorator implements DecoratorInterface } } - - - diff --git a/app/Export/Decorators/PurchaseOrderDecorator.php b/app/Export/Decorators/PurchaseOrderDecorator.php index e87df1f02226..362f155174da 100644 --- a/app/Export/Decorators/PurchaseOrderDecorator.php +++ b/app/Export/Decorators/PurchaseOrderDecorator.php @@ -27,20 +27,22 @@ class PurchaseOrderDecorator extends Decorator implements DecoratorInterface if($purchase_order && method_exists($this, $key)) { return $this->{$key}($purchase_order); - } - elseif($purchase_order->{$key}) + } elseif($purchase_order->{$key}) { return $purchase_order->{$key} ?? ''; + } return ''; } - public function status(PurchaseOrder $purchase_order) { + public function status(PurchaseOrder $purchase_order) + { return $purchase_order->stringStatus($purchase_order->status_id); } - public function currency_id(PurchaseOrder $purchase_order) { + public function currency_id(PurchaseOrder $purchase_order) + { return $purchase_order->currency ? $purchase_order->currency->code : $purchase_order->company->currency()->code; } - + } diff --git a/app/Export/Decorators/QuoteDecorator.php b/app/Export/Decorators/QuoteDecorator.php index 24e5297bc6e1..8e44e5792129 100644 --- a/app/Export/Decorators/QuoteDecorator.php +++ b/app/Export/Decorators/QuoteDecorator.php @@ -35,21 +35,29 @@ class QuoteDecorator extends Decorator implements DecoratorInterface } - public function status(Quote $quote) { + public function status(Quote $quote) + { return $quote->stringStatus($quote->status_id); } - public function uses_inclusive_taxes(Quote $quote) { + + public function uses_inclusive_taxes(Quote $quote) + { return $quote->uses_inclusive_taxes ? ctrans('texts.yes') : ctrans('texts.no'); } - public function is_amount_discount(Quote $quote) { + + public function is_amount_discount(Quote $quote) + { return $quote->is_amount_discount ? ctrans('texts.yes') : ctrans('texts.no'); } - public function assigned_user_id(Quote $quote) { + + public function assigned_user_id(Quote $quote) + { return $quote->assigned_user ? $quote->assigned_user->present()->name() : ''; } - public function user_id(Quote $quote) { + + public function user_id(Quote $quote) + { return $quote->user->present()->name(); } } - diff --git a/app/Export/Decorators/RecurringInvoiceDecorator.php b/app/Export/Decorators/RecurringInvoiceDecorator.php index b32bda1456cf..cfda7f23b656 100644 --- a/app/Export/Decorators/RecurringInvoiceDecorator.php +++ b/app/Export/Decorators/RecurringInvoiceDecorator.php @@ -35,28 +35,43 @@ class RecurringInvoiceDecorator extends Decorator implements DecoratorInterface } - public function status(RecurringInvoice $recurring_invoice) { + public function status(RecurringInvoice $recurring_invoice) + { return $recurring_invoice->stringStatus($recurring_invoice->status_id); } - public function uses_inclusive_taxes(RecurringInvoice $recurring_invoice) { + + public function uses_inclusive_taxes(RecurringInvoice $recurring_invoice) + { return $recurring_invoice->uses_inclusive_taxes ? ctrans('texts.yes') : ctrans('texts.no'); } - public function is_amount_discount(RecurringInvoice $recurring_invoice) { + + public function is_amount_discount(RecurringInvoice $recurring_invoice) + { return $recurring_invoice->is_amount_discount ? ctrans('texts.yes') : ctrans('texts.no'); } - public function assigned_user_id(RecurringInvoice $recurring_invoice) { + + public function assigned_user_id(RecurringInvoice $recurring_invoice) + { return $recurring_invoice->assigned_user ? $recurring_invoice->assigned_user->present()->name() : ''; } - public function user_id(RecurringInvoice $recurring_invoice) { + + public function user_id(RecurringInvoice $recurring_invoice) + { return $recurring_invoice->user->present()->name() ?? ''; } - public function frequency_id(RecurringInvoice $recurring_invoice) { + + public function frequency_id(RecurringInvoice $recurring_invoice) + { return $recurring_invoice->frequency_id ? $recurring_invoice->frequencyForKey($recurring_invoice->frequency_id) : ''; } - public function auto_bill(RecurringInvoice $recurring_invoice) { + + public function auto_bill(RecurringInvoice $recurring_invoice) + { return $recurring_invoice->auto_bill ? ctrans("texts.{$recurring_invoice->auto_bill}") : ''; } - public function auto_bill_enabled(RecurringInvoice $recurring_invoice) { + + public function auto_bill_enabled(RecurringInvoice $recurring_invoice) + { return $recurring_invoice->auto_bill_enabled ? ctrans('texts.yes') : ctrans('texts.no'); } diff --git a/app/Export/Decorators/TaskDecorator.php b/app/Export/Decorators/TaskDecorator.php index 7c51c2a6629d..32a81e6a7097 100644 --- a/app/Export/Decorators/TaskDecorator.php +++ b/app/Export/Decorators/TaskDecorator.php @@ -11,10 +11,10 @@ namespace App\Export\Decorators; -use Carbon\Carbon; +use App\Models\DateFormat; use App\Models\Task; use App\Models\Timezone; -use App\Models\DateFormat; +use Carbon\Carbon; class TaskDecorator extends Decorator implements DecoratorInterface { @@ -38,7 +38,8 @@ class TaskDecorator extends Decorator implements DecoratorInterface } - public function start_date(Task $task){ + public function start_date(Task $task) + { $timezone = Timezone::find($task->company->settings->timezone_id); $timezone_name = 'US/Eastern'; @@ -57,7 +58,7 @@ class TaskDecorator extends Decorator implements DecoratorInterface $date_format_default = $date_format->format; } - if(is_array($logs)){ + if(is_array($logs)) { $item = $logs[0]; return Carbon::createFromTimeStamp($item[0])->setTimezone($timezone_name)->format($date_format_default); } @@ -66,7 +67,8 @@ class TaskDecorator extends Decorator implements DecoratorInterface } - public function end_date(Task $task){ + public function end_date(Task $task) + { $timezone = Timezone::find($task->company->settings->timezone_id); $timezone_name = 'US/Eastern'; @@ -93,13 +95,18 @@ class TaskDecorator extends Decorator implements DecoratorInterface return ''; } - public function duration(Task $task){ + public function duration(Task $task) + { return $task->calcDuration(); } - public function status_id(Task $task){ + + public function status_id(Task $task) + { return $task->status()->exists() ? $task->status->name : ''; } - public function project_id(Task $task){ + + public function project_id(Task $task) + { return $task->project()->exists() ? $task->project->name : ''; } diff --git a/app/Export/Decorators/VendorContactDecorator.php b/app/Export/Decorators/VendorContactDecorator.php index 70b90de45353..d92175334163 100644 --- a/app/Export/Decorators/VendorContactDecorator.php +++ b/app/Export/Decorators/VendorContactDecorator.php @@ -27,13 +27,13 @@ class VendorContactDecorator implements DecoratorInterface if($contact && method_exists($this, $key)) { return $this->{$key}($contact); - } - elseif($contact->{$key}) + } elseif($contact->{$key}) { return $contact->{$key} ?? ''; + } return ''; } - + } diff --git a/app/Export/Decorators/VendorDecorator.php b/app/Export/Decorators/VendorDecorator.php index b31abbf2ccbe..8443172d3892 100644 --- a/app/Export/Decorators/VendorDecorator.php +++ b/app/Export/Decorators/VendorDecorator.php @@ -35,16 +35,23 @@ class VendorDecorator extends Decorator implements DecoratorInterface } - public function country_id(Vendor $vendor){ + public function country_id(Vendor $vendor) + { return $vendor->country ? $vendor->country->name : ''; } - public function name(Vendor $vendor){ + + public function name(Vendor $vendor) + { return $vendor->present()->name(); } - public function currency(Vendor $vendor){ + + public function currency(Vendor $vendor) + { return $vendor->currency_id ? $vendor->currency()->code : $vendor->company->currency()->code; } - public function classification(Vendor $vendor) { + + public function classification(Vendor $vendor) + { ctrans("texts.{$vendor->classification}") ?? ''; } diff --git a/app/Factory/CompanyFactory.php b/app/Factory/CompanyFactory.php index a09dcb914dd5..0f68ec941896 100644 --- a/app/Factory/CompanyFactory.php +++ b/app/Factory/CompanyFactory.php @@ -11,13 +11,13 @@ namespace App\Factory; -use App\Utils\Ninja; -use App\Models\Company; -use App\Libraries\MultiDB; -use App\Utils\Traits\MakesHash; -use App\DataMapper\Tax\TaxModel; -use App\DataMapper\CompanySettings; use App\DataMapper\ClientRegistrationFields; +use App\DataMapper\CompanySettings; +use App\DataMapper\Tax\TaxModel; +use App\Libraries\MultiDB; +use App\Models\Company; +use App\Utils\Ninja; +use App\Utils\Traits\MakesHash; class CompanyFactory { diff --git a/app/Filters/CreditFilters.php b/app/Filters/CreditFilters.php index a4dd3f33bf46..74465a466f1b 100644 --- a/app/Filters/CreditFilters.php +++ b/app/Filters/CreditFilters.php @@ -107,13 +107,13 @@ class CreditFilters extends QueryFilters return $this->builder; } - return $this->builder->where(function ($query){ - $query->whereIn('status_id', [Credit::STATUS_SENT, Credit::STATUS_PARTIAL]) - ->where('balance', '>', 0) - ->where(function ($q){ - $q->whereNull('due_date')->orWhere('due_date', '>', now()); - }); - }); + return $this->builder->where(function ($query) { + $query->whereIn('status_id', [Credit::STATUS_SENT, Credit::STATUS_PARTIAL]) + ->where('balance', '>', 0) + ->where(function ($q) { + $q->whereNull('due_date')->orWhere('due_date', '>', now()); + }); + }); } public function number(string $number = ''): Builder diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 73b5cfa4b58d..ef6a5db29b6e 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -527,10 +527,9 @@ class LoginController extends BaseController if (request()->has('id_token')) { $user = $google->getTokenResponse(request()->input('id_token')); - }elseif(request()->has('access_token')){ + } elseif(request()->has('access_token')) { $user = $google->harvestUser(request()->input('access_token')); - } - else { + } else { return response()->json(['message' => 'Illegal request'], 403); } diff --git a/app/Http/Controllers/ClientController.php b/app/Http/Controllers/ClientController.php index c16fd8bd0203..333cdbd7b598 100644 --- a/app/Http/Controllers/ClientController.php +++ b/app/Http/Controllers/ClientController.php @@ -11,37 +11,37 @@ namespace App\Http\Controllers; -use App\Utils\Ninja; -use App\Models\Client; -use App\Models\Account; -use App\Models\Company; -use App\Models\SystemLog; -use Postmark\PostmarkClient; -use Illuminate\Http\Response; -use App\Factory\ClientFactory; -use App\Filters\ClientFilters; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\Uploadable; -use App\Utils\Traits\BulkOptions; -use App\Jobs\Client\UpdateTaxData; -use App\Utils\Traits\SavesDocuments; -use App\Repositories\ClientRepository; use App\Events\Client\ClientWasCreated; use App\Events\Client\ClientWasUpdated; -use App\Transformers\ClientTransformer; -use Illuminate\Support\Facades\Storage; -use App\Services\Template\TemplateAction; -use App\Jobs\PostMark\ProcessPostmarkWebhook; +use App\Factory\ClientFactory; +use App\Filters\ClientFilters; use App\Http\Requests\Client\BulkClientRequest; -use App\Http\Requests\Client\EditClientRequest; -use App\Http\Requests\Client\ShowClientRequest; -use App\Http\Requests\Client\PurgeClientRequest; -use App\Http\Requests\Client\StoreClientRequest; use App\Http\Requests\Client\CreateClientRequest; +use App\Http\Requests\Client\DestroyClientRequest; +use App\Http\Requests\Client\EditClientRequest; +use App\Http\Requests\Client\PurgeClientRequest; +use App\Http\Requests\Client\ReactivateClientEmailRequest; +use App\Http\Requests\Client\ShowClientRequest; +use App\Http\Requests\Client\StoreClientRequest; use App\Http\Requests\Client\UpdateClientRequest; use App\Http\Requests\Client\UploadClientRequest; -use App\Http\Requests\Client\DestroyClientRequest; -use App\Http\Requests\Client\ReactivateClientEmailRequest; +use App\Jobs\Client\UpdateTaxData; +use App\Jobs\PostMark\ProcessPostmarkWebhook; +use App\Models\Account; +use App\Models\Client; +use App\Models\Company; +use App\Models\SystemLog; +use App\Repositories\ClientRepository; +use App\Services\Template\TemplateAction; +use App\Transformers\ClientTransformer; +use App\Utils\Ninja; +use App\Utils\Traits\BulkOptions; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\SavesDocuments; +use App\Utils\Traits\Uploadable; +use Illuminate\Http\Response; +use Illuminate\Support\Facades\Storage; +use Postmark\PostmarkClient; /** * Class ClientController. @@ -218,7 +218,7 @@ class ClientController extends BaseController $clients = Client::withTrashed() ->company() ->whereIn('id', $request->ids) - ->get(); + ->get(); if($action == 'template' && $user->can('view', $clients->first())) { @@ -387,7 +387,7 @@ class ClientController extends BaseController /** @var \Postmark\Models\DynamicResponseModel $response */ $response = $postmark->activateBounce((int)$bounce_id); - if($response && $response?->Message == 'OK' && !$response->Bounce->Inactive && $response->Bounce->Email){ + if($response && $response?->Message == 'OK' && !$response->Bounce->Inactive && $response->Bounce->Email) { $email = $response->Bounce->Email; //remove email from quarantine. //@TODO diff --git a/app/Http/Controllers/ClientPortal/InvitationController.php b/app/Http/Controllers/ClientPortal/InvitationController.php index 15533c7c2cdb..9daef9d92a6e 100644 --- a/app/Http/Controllers/ClientPortal/InvitationController.php +++ b/app/Http/Controllers/ClientPortal/InvitationController.php @@ -168,7 +168,7 @@ class InvitationController extends Controller set_time_limit(45); // if (Ninja::isHosted()) { - return $this->returnRawPdf($entity, $invitation_key); + return $this->returnRawPdf($entity, $invitation_key); // } // return redirect('client/'.$entity.'/'.$invitation_key.'/download_pdf'); diff --git a/app/Http/Controllers/ClientPortal/InvoiceController.php b/app/Http/Controllers/ClientPortal/InvoiceController.php index 871642b2747a..5cf617be6b19 100644 --- a/app/Http/Controllers/ClientPortal/InvoiceController.php +++ b/app/Http/Controllers/ClientPortal/InvoiceController.php @@ -30,7 +30,6 @@ use Illuminate\Contracts\View\Factory; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Cache; -use Illuminate\Support\Facades\Storage; use Illuminate\View\View; class InvoiceController extends Controller diff --git a/app/Http/Controllers/CompanyGatewayController.php b/app/Http/Controllers/CompanyGatewayController.php index 990a886f906b..96b91e30b467 100644 --- a/app/Http/Controllers/CompanyGatewayController.php +++ b/app/Http/Controllers/CompanyGatewayController.php @@ -201,15 +201,15 @@ class CompanyGatewayController extends BaseController $company_gateway->fill($request->all()); $company_gateway->save(); - /*Always ensure at least one fees and limits object is set per gateway*/ + /*Always ensure at least one fees and limits object is set per gateway*/ $gateway_types = $company_gateway->driver(new Client)->getAvailableMethods(); $fees_and_limits = $company_gateway->fees_and_limits; - foreach($gateway_types as $key => $gateway_type) - { - if(!property_exists($fees_and_limits, $key)) + foreach($gateway_types as $key => $gateway_type) { + if(!property_exists($fees_and_limits, $key)) { $fees_and_limits->{$key} = new FeesAndLimits; + } } $company_gateway->fees_and_limits = $fees_and_limits; diff --git a/app/Http/Controllers/CreditController.php b/app/Http/Controllers/CreditController.php index 439c986f19e9..9ad71d06756c 100644 --- a/app/Http/Controllers/CreditController.php +++ b/app/Http/Controllers/CreditController.php @@ -11,36 +11,36 @@ namespace App\Http\Controllers; -use App\Utils\Ninja; -use App\Models\Client; -use App\Models\Credit; -use App\Models\Account; -use App\Models\Invoice; -use Illuminate\Http\Response; -use App\Factory\CreditFactory; -use App\Filters\CreditFilters; -use App\Jobs\Credit\ZipCredits; -use App\Utils\Traits\MakesHash; -use App\Jobs\Entity\EmailEntity; -use App\Factory\CloneCreditFactory; -use App\Services\PdfMaker\PdfMerge; -use Illuminate\Support\Facades\App; -use App\Utils\Traits\SavesDocuments; -use App\Repositories\CreditRepository; use App\Events\Credit\CreditWasCreated; use App\Events\Credit\CreditWasUpdated; -use App\Transformers\CreditTransformer; -use Illuminate\Support\Facades\Storage; -use App\Services\Template\TemplateAction; +use App\Factory\CloneCreditFactory; +use App\Factory\CreditFactory; +use App\Filters\CreditFilters; +use App\Http\Requests\Credit\ActionCreditRequest; use App\Http\Requests\Credit\BulkCreditRequest; +use App\Http\Requests\Credit\CreateCreditRequest; +use App\Http\Requests\Credit\DestroyCreditRequest; use App\Http\Requests\Credit\EditCreditRequest; use App\Http\Requests\Credit\ShowCreditRequest; use App\Http\Requests\Credit\StoreCreditRequest; -use App\Http\Requests\Credit\ActionCreditRequest; -use App\Http\Requests\Credit\CreateCreditRequest; use App\Http\Requests\Credit\UpdateCreditRequest; use App\Http\Requests\Credit\UploadCreditRequest; -use App\Http\Requests\Credit\DestroyCreditRequest; +use App\Jobs\Credit\ZipCredits; +use App\Jobs\Entity\EmailEntity; +use App\Models\Account; +use App\Models\Client; +use App\Models\Credit; +use App\Models\Invoice; +use App\Repositories\CreditRepository; +use App\Services\PdfMaker\PdfMerge; +use App\Services\Template\TemplateAction; +use App\Transformers\CreditTransformer; +use App\Utils\Ninja; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\SavesDocuments; +use Illuminate\Http\Response; +use Illuminate\Support\Facades\App; +use Illuminate\Support\Facades\Storage; /** * Class CreditController. diff --git a/app/Http/Controllers/EmailController.php b/app/Http/Controllers/EmailController.php index f5f74685b476..5bdcdb8ac712 100644 --- a/app/Http/Controllers/EmailController.php +++ b/app/Http/Controllers/EmailController.php @@ -71,8 +71,9 @@ class EmailController extends BaseController if ($request->cc_email && (Ninja::isSelfHost() || $user->account->isPaidHostedClient())) { - foreach($request->cc_email as $email) + foreach($request->cc_email as $email) { $mo->cc[] = new Address($email); + } } diff --git a/app/Http/Controllers/ExpenseController.php b/app/Http/Controllers/ExpenseController.php index c70959f86e66..08571e09613d 100644 --- a/app/Http/Controllers/ExpenseController.php +++ b/app/Http/Controllers/ExpenseController.php @@ -11,28 +11,28 @@ namespace App\Http\Controllers; -use App\Utils\Ninja; -use App\Models\Account; -use App\Models\Expense; -use Illuminate\Http\Response; -use App\Factory\ExpenseFactory; -use App\Filters\ExpenseFilters; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\Uploadable; -use App\Utils\Traits\BulkOptions; -use App\Utils\Traits\SavesDocuments; -use App\Repositories\ExpenseRepository; -use App\Transformers\ExpenseTransformer; use App\Events\Expense\ExpenseWasCreated; use App\Events\Expense\ExpenseWasUpdated; +use App\Factory\ExpenseFactory; +use App\Filters\ExpenseFilters; use App\Http\Requests\Expense\BulkExpenseRequest; +use App\Http\Requests\Expense\CreateExpenseRequest; +use App\Http\Requests\Expense\DestroyExpenseRequest; use App\Http\Requests\Expense\EditExpenseRequest; use App\Http\Requests\Expense\ShowExpenseRequest; use App\Http\Requests\Expense\StoreExpenseRequest; -use App\Http\Requests\Expense\CreateExpenseRequest; use App\Http\Requests\Expense\UpdateExpenseRequest; use App\Http\Requests\Expense\UploadExpenseRequest; -use App\Http\Requests\Expense\DestroyExpenseRequest; +use App\Models\Account; +use App\Models\Expense; +use App\Repositories\ExpenseRepository; +use App\Transformers\ExpenseTransformer; +use App\Utils\Ninja; +use App\Utils\Traits\BulkOptions; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\SavesDocuments; +use App\Utils\Traits\Uploadable; +use Illuminate\Http\Response; /** * Class ExpenseController. diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index 6e6fee2c7f3e..477ab8111d2a 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -528,7 +528,7 @@ class InvoiceController extends BaseController $filename = $invoices->first()->getFileName(); - return response()->streamDownload(function () use($invoices) { + return response()->streamDownload(function () use ($invoices) { echo $invoices->first()->service()->getInvoicePdf(); }, $filename, ['Content-Type' => 'application/pdf']); } diff --git a/app/Http/Controllers/PaymentController.php b/app/Http/Controllers/PaymentController.php index d413c7029612..10b8af7dcb38 100644 --- a/app/Http/Controllers/PaymentController.php +++ b/app/Http/Controllers/PaymentController.php @@ -11,27 +11,27 @@ namespace App\Http\Controllers; -use App\Utils\Ninja; -use App\Models\Account; -use App\Models\Payment; -use Illuminate\Http\Response; +use App\Events\Payment\PaymentWasUpdated; use App\Factory\PaymentFactory; use App\Filters\PaymentFilters; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\SavesDocuments; -use App\Repositories\PaymentRepository; -use App\Transformers\PaymentTransformer; -use App\Events\Payment\PaymentWasUpdated; -use App\Services\Template\TemplateAction; +use App\Http\Requests\Payment\BulkActionPaymentRequest; +use App\Http\Requests\Payment\CreatePaymentRequest; +use App\Http\Requests\Payment\DestroyPaymentRequest; use App\Http\Requests\Payment\EditPaymentRequest; +use App\Http\Requests\Payment\RefundPaymentRequest; use App\Http\Requests\Payment\ShowPaymentRequest; use App\Http\Requests\Payment\StorePaymentRequest; -use App\Http\Requests\Payment\CreatePaymentRequest; -use App\Http\Requests\Payment\RefundPaymentRequest; use App\Http\Requests\Payment\UpdatePaymentRequest; use App\Http\Requests\Payment\UploadPaymentRequest; -use App\Http\Requests\Payment\DestroyPaymentRequest; -use App\Http\Requests\Payment\BulkActionPaymentRequest; +use App\Models\Account; +use App\Models\Payment; +use App\Repositories\PaymentRepository; +use App\Services\Template\TemplateAction; +use App\Transformers\PaymentTransformer; +use App\Utils\Ninja; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\SavesDocuments; +use Illuminate\Http\Response; /** * Class PaymentController. @@ -519,7 +519,7 @@ class PaymentController extends BaseController if($action == 'template' && $user->can('view', $payments->first())) { $hash_or_response = request()->boolean('send_email') ? 'email sent' : \Illuminate\Support\Str::uuid(); -nlog($payments->pluck('hashed_id')->toArray()); + nlog($payments->pluck('hashed_id')->toArray()); TemplateAction::dispatch( $payments->pluck('hashed_id')->toArray(), $request->template_id, diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index 0359f5fa0076..e98f65c1f980 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -11,33 +11,31 @@ namespace App\Http\Controllers; -use App\Utils\Ninja; -use App\Models\Client; -use App\Models\Invoice; -use App\Utils\HtmlEngine; -use Twig\Error\SyntaxError; -use App\Jobs\Util\PreviewPdf; -use App\Models\ClientContact; -use App\Services\Pdf\PdfMock; -use App\Utils\Traits\MakesHash; -use App\Services\Pdf\PdfService; -use App\Utils\PhantomJS\Phantom; -use App\Models\InvoiceInvitation; -use App\Services\PdfMaker\Design; -use App\Utils\HostedPDF\NinjaPdf; -use Illuminate\Support\Facades\DB; -use App\Services\PdfMaker\PdfMaker; -use Illuminate\Support\Facades\App; -use App\Utils\Traits\MakesInvoiceHtml; -use Turbo124\Beacon\Facades\LightLogs; -use App\Utils\Traits\Pdf\PageNumbering; -use Illuminate\Support\Facades\Response; use App\DataMapper\Analytics\LivePreview; -use App\Services\Template\TemplateService; use App\Http\Requests\Preview\DesignPreviewRequest; -use App\Services\PdfMaker\Design as PdfDesignModel; -use App\Services\PdfMaker\Design as PdfMakerDesign; use App\Http\Requests\Preview\PreviewInvoiceRequest; +use App\Jobs\Util\PreviewPdf; +use App\Models\Client; +use App\Models\ClientContact; +use App\Models\Invoice; +use App\Models\InvoiceInvitation; +use App\Services\Pdf\PdfMock; +use App\Services\Pdf\PdfService; +use App\Services\PdfMaker\Design; +use App\Services\PdfMaker\PdfMaker; +use App\Services\Template\TemplateService; +use App\Utils\HostedPDF\NinjaPdf; +use App\Utils\HtmlEngine; +use App\Utils\Ninja; +use App\Utils\PhantomJS\Phantom; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\MakesInvoiceHtml; +use App\Utils\Traits\Pdf\PageNumbering; +use Illuminate\Support\Facades\App; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Response; +use Turbo124\Beacon\Facades\LightLogs; +use Twig\Error\SyntaxError; class PreviewController extends BaseController { diff --git a/app/Http/Controllers/PreviewPurchaseOrderController.php b/app/Http/Controllers/PreviewPurchaseOrderController.php index cdc0ff98de76..e0dbd3343029 100644 --- a/app/Http/Controllers/PreviewPurchaseOrderController.php +++ b/app/Http/Controllers/PreviewPurchaseOrderController.php @@ -11,33 +11,33 @@ namespace App\Http\Controllers; -use App\Utils\Ninja; -use App\Models\Client; -use App\Models\Vendor; -use App\Libraries\MultiDB; -use App\Jobs\Util\PreviewPdf; -use App\Models\PurchaseOrder; -use App\Models\VendorContact; -use App\Utils\Traits\MakesHash; -use App\Utils\VendorHtmlEngine; -use App\Services\Pdf\PdfService; -use App\Utils\PhantomJS\Phantom; -use App\Services\PdfMaker\Design; -use App\Utils\HostedPDF\NinjaPdf; -use Illuminate\Support\Facades\DB; -use App\Services\PdfMaker\PdfMaker; -use Illuminate\Support\Facades\App; -use App\Factory\PurchaseOrderFactory; -use App\Utils\Traits\MakesInvoiceHtml; -use Turbo124\Beacon\Facades\LightLogs; -use App\Models\PurchaseOrderInvitation; -use App\Utils\Traits\Pdf\PageNumbering; -use Illuminate\Support\Facades\Response; use App\DataMapper\Analytics\LivePreview; +use App\Factory\PurchaseOrderFactory; +use App\Http\Requests\Preview\PreviewPurchaseOrderRequest; +use App\Jobs\Util\PreviewPdf; +use App\Libraries\MultiDB; +use App\Models\Client; +use App\Models\PurchaseOrder; +use App\Models\PurchaseOrderInvitation; +use App\Models\Vendor; +use App\Models\VendorContact; use App\Repositories\PurchaseOrderRepository; +use App\Services\Pdf\PdfService; +use App\Services\PdfMaker\Design; use App\Services\PdfMaker\Design as PdfDesignModel; use App\Services\PdfMaker\Design as PdfMakerDesign; -use App\Http\Requests\Preview\PreviewPurchaseOrderRequest; +use App\Services\PdfMaker\PdfMaker; +use App\Utils\HostedPDF\NinjaPdf; +use App\Utils\Ninja; +use App\Utils\PhantomJS\Phantom; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\MakesInvoiceHtml; +use App\Utils\Traits\Pdf\PageNumbering; +use App\Utils\VendorHtmlEngine; +use Illuminate\Support\Facades\App; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Response; +use Turbo124\Beacon\Facades\LightLogs; class PreviewPurchaseOrderController extends BaseController { diff --git a/app/Http/Controllers/ProjectController.php b/app/Http/Controllers/ProjectController.php index 79dc2c3b8a66..d57b023f6d61 100644 --- a/app/Http/Controllers/ProjectController.php +++ b/app/Http/Controllers/ProjectController.php @@ -11,25 +11,25 @@ namespace App\Http\Controllers; -use App\Models\Account; -use App\Models\Project; -use Illuminate\Http\Response; use App\Factory\ProjectFactory; use App\Filters\ProjectFilters; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\SavesDocuments; -use App\Utils\Traits\GeneratesCounter; -use App\Repositories\ProjectRepository; -use App\Transformers\ProjectTransformer; -use App\Services\Template\TemplateAction; +use App\Http\Requests\Project\BulkProjectRequest; +use App\Http\Requests\Project\CreateProjectRequest; +use App\Http\Requests\Project\DestroyProjectRequest; use App\Http\Requests\Project\EditProjectRequest; use App\Http\Requests\Project\ShowProjectRequest; use App\Http\Requests\Project\StoreProjectRequest; -use App\Http\Requests\Project\CreateProjectRequest; use App\Http\Requests\Project\UpdateProjectRequest; use App\Http\Requests\Project\UploadProjectRequest; -use App\Http\Requests\Project\DestroyProjectRequest; -use App\Http\Requests\Project\BulkProjectRequest; +use App\Models\Account; +use App\Models\Project; +use App\Repositories\ProjectRepository; +use App\Services\Template\TemplateAction; +use App\Transformers\ProjectTransformer; +use App\Utils\Traits\GeneratesCounter; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\SavesDocuments; +use Illuminate\Http\Response; /** * Class ProjectController. diff --git a/app/Http/Controllers/PurchaseOrderController.php b/app/Http/Controllers/PurchaseOrderController.php index 61fa572c5bfe..f25294bb6e1b 100644 --- a/app/Http/Controllers/PurchaseOrderController.php +++ b/app/Http/Controllers/PurchaseOrderController.php @@ -11,34 +11,34 @@ namespace App\Http\Controllers; -use App\Utils\Ninja; -use App\Models\Client; -use App\Models\Account; -use App\Models\PurchaseOrder; -use Illuminate\Http\Response; -use App\Utils\Traits\MakesHash; -use App\Jobs\Entity\CreateRawPdf; -use App\Services\PdfMaker\PdfMerge; -use App\Utils\Traits\SavesDocuments; -use App\Factory\PurchaseOrderFactory; -use App\Filters\PurchaseOrderFilters; -use Illuminate\Support\Facades\Storage; -use App\Services\Template\TemplateAction; -use App\Jobs\PurchaseOrder\ZipPurchaseOrders; -use App\Repositories\PurchaseOrderRepository; -use App\Jobs\PurchaseOrder\PurchaseOrderEmail; -use App\Transformers\PurchaseOrderTransformer; use App\Events\PurchaseOrder\PurchaseOrderWasCreated; use App\Events\PurchaseOrder\PurchaseOrderWasUpdated; +use App\Factory\PurchaseOrderFactory; +use App\Filters\PurchaseOrderFilters; +use App\Http\Requests\PurchaseOrder\ActionPurchaseOrderRequest; use App\Http\Requests\PurchaseOrder\BulkPurchaseOrderRequest; +use App\Http\Requests\PurchaseOrder\CreatePurchaseOrderRequest; +use App\Http\Requests\PurchaseOrder\DestroyPurchaseOrderRequest; use App\Http\Requests\PurchaseOrder\EditPurchaseOrderRequest; use App\Http\Requests\PurchaseOrder\ShowPurchaseOrderRequest; use App\Http\Requests\PurchaseOrder\StorePurchaseOrderRequest; -use App\Http\Requests\PurchaseOrder\ActionPurchaseOrderRequest; -use App\Http\Requests\PurchaseOrder\CreatePurchaseOrderRequest; use App\Http\Requests\PurchaseOrder\UpdatePurchaseOrderRequest; use App\Http\Requests\PurchaseOrder\UploadPurchaseOrderRequest; -use App\Http\Requests\PurchaseOrder\DestroyPurchaseOrderRequest; +use App\Jobs\Entity\CreateRawPdf; +use App\Jobs\PurchaseOrder\PurchaseOrderEmail; +use App\Jobs\PurchaseOrder\ZipPurchaseOrders; +use App\Models\Account; +use App\Models\Client; +use App\Models\PurchaseOrder; +use App\Repositories\PurchaseOrderRepository; +use App\Services\PdfMaker\PdfMerge; +use App\Services\Template\TemplateAction; +use App\Transformers\PurchaseOrderTransformer; +use App\Utils\Ninja; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\SavesDocuments; +use Illuminate\Http\Response; +use Illuminate\Support\Facades\Storage; class PurchaseOrderController extends BaseController { diff --git a/app/Http/Controllers/QuoteController.php b/app/Http/Controllers/QuoteController.php index b8fd4bae7fad..adb36637667a 100644 --- a/app/Http/Controllers/QuoteController.php +++ b/app/Http/Controllers/QuoteController.php @@ -11,41 +11,41 @@ namespace App\Http\Controllers; -use App\Utils\Ninja; -use App\Models\Quote; -use App\Models\Client; -use App\Models\Account; -use App\Models\Invoice; -use App\Models\Project; -use Illuminate\Http\Request; -use App\Factory\QuoteFactory; -use App\Filters\QuoteFilters; -use App\Jobs\Quote\ZipQuotes; -use Illuminate\Http\Response; -use App\Utils\Traits\MakesHash; -use App\Factory\CloneQuoteFactory; -use App\Services\PdfMaker\PdfMerge; -use Illuminate\Support\Facades\App; -use App\Utils\Traits\SavesDocuments; use App\Events\Quote\QuoteWasCreated; use App\Events\Quote\QuoteWasUpdated; -use App\Repositories\QuoteRepository; -use App\Transformers\QuoteTransformer; -use App\Utils\Traits\GeneratesCounter; -use Illuminate\Support\Facades\Storage; -use App\Transformers\InvoiceTransformer; -use App\Transformers\ProjectTransformer; -use App\Services\Template\TemplateAction; +use App\Factory\CloneQuoteFactory; use App\Factory\CloneQuoteToInvoiceFactory; +use App\Factory\QuoteFactory; +use App\Filters\QuoteFilters; +use App\Http\Requests\Quote\ActionQuoteRequest; +use App\Http\Requests\Quote\BulkActionQuoteRequest; +use App\Http\Requests\Quote\CreateQuoteRequest; +use App\Http\Requests\Quote\DestroyQuoteRequest; use App\Http\Requests\Quote\EditQuoteRequest; use App\Http\Requests\Quote\ShowQuoteRequest; use App\Http\Requests\Quote\StoreQuoteRequest; -use App\Http\Requests\Quote\ActionQuoteRequest; -use App\Http\Requests\Quote\CreateQuoteRequest; use App\Http\Requests\Quote\UpdateQuoteRequest; use App\Http\Requests\Quote\UploadQuoteRequest; -use App\Http\Requests\Quote\DestroyQuoteRequest; -use App\Http\Requests\Quote\BulkActionQuoteRequest; +use App\Jobs\Quote\ZipQuotes; +use App\Models\Account; +use App\Models\Client; +use App\Models\Invoice; +use App\Models\Project; +use App\Models\Quote; +use App\Repositories\QuoteRepository; +use App\Services\PdfMaker\PdfMerge; +use App\Services\Template\TemplateAction; +use App\Transformers\InvoiceTransformer; +use App\Transformers\ProjectTransformer; +use App\Transformers\QuoteTransformer; +use App\Utils\Ninja; +use App\Utils\Traits\GeneratesCounter; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\SavesDocuments; +use Illuminate\Http\Request; +use Illuminate\Http\Response; +use Illuminate\Support\Facades\App; +use Illuminate\Support\Facades\Storage; /** * Class QuoteController. @@ -854,7 +854,7 @@ class QuoteController extends BaseController $headers = array_merge($headers, ['Content-Disposition' => 'inline']); } - return response()->streamDownload(function () use ($quote,$contact) { + return response()->streamDownload(function () use ($quote, $contact) { echo $quote->service()->getQuotePdf($contact); }, $quote->getFileName(), $headers); diff --git a/app/Http/Controllers/Reports/ARDetailReportController.php b/app/Http/Controllers/Reports/ARDetailReportController.php index 1d3183a41d29..3eecd27cac2a 100644 --- a/app/Http/Controllers/Reports/ARDetailReportController.php +++ b/app/Http/Controllers/Reports/ARDetailReportController.php @@ -11,12 +11,12 @@ namespace App\Http\Controllers\Reports; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; -use App\Jobs\Report\PreviewReport; -use App\Services\Report\ARDetailReport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Services\Report\ARDetailReport; +use App\Utils\Traits\MakesHash; class ARDetailReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/ARSummaryReportController.php b/app/Http/Controllers/Reports/ARSummaryReportController.php index 0898c9e408ae..9b1ff6d25f61 100644 --- a/app/Http/Controllers/Reports/ARSummaryReportController.php +++ b/app/Http/Controllers/Reports/ARSummaryReportController.php @@ -11,12 +11,12 @@ namespace App\Http\Controllers\Reports; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; -use App\Jobs\Report\PreviewReport; use App\Http\Controllers\BaseController; -use App\Services\Report\ARSummaryReport; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Services\Report\ARSummaryReport; +use App\Utils\Traits\MakesHash; class ARSummaryReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/ClientBalanceReportController.php b/app/Http/Controllers/Reports/ClientBalanceReportController.php index d3b1859dd07c..d5dfb8cb4870 100644 --- a/app/Http/Controllers/Reports/ClientBalanceReportController.php +++ b/app/Http/Controllers/Reports/ClientBalanceReportController.php @@ -11,12 +11,12 @@ namespace App\Http\Controllers\Reports; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; -use App\Jobs\Report\PreviewReport; use App\Http\Controllers\BaseController; -use App\Services\Report\ClientBalanceReport; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Services\Report\ClientBalanceReport; +use App\Utils\Traits\MakesHash; class ClientBalanceReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/ClientSalesReportController.php b/app/Http/Controllers/Reports/ClientSalesReportController.php index 612986f42123..545c89bb6ea8 100644 --- a/app/Http/Controllers/Reports/ClientSalesReportController.php +++ b/app/Http/Controllers/Reports/ClientSalesReportController.php @@ -11,12 +11,12 @@ namespace App\Http\Controllers\Reports; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; -use App\Jobs\Report\PreviewReport; use App\Http\Controllers\BaseController; -use App\Services\Report\ClientSalesReport; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Services\Report\ClientSalesReport; +use App\Utils\Traits\MakesHash; class ClientSalesReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/ProductSalesReportController.php b/app/Http/Controllers/Reports/ProductSalesReportController.php index a2b8902db852..796adfd1e492 100644 --- a/app/Http/Controllers/Reports/ProductSalesReportController.php +++ b/app/Http/Controllers/Reports/ProductSalesReportController.php @@ -11,14 +11,14 @@ namespace App\Http\Controllers\Reports; -use App\Models\Client; -use Illuminate\Http\Response; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; -use App\Jobs\Report\PreviewReport; use App\Export\CSV\ProductSalesExport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\ProductSalesReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Models\Client; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\Response; class ProductSalesReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/ProfitAndLossController.php b/app/Http/Controllers/Reports/ProfitAndLossController.php index 18e575dd8d7c..7d52865eb927 100644 --- a/app/Http/Controllers/Reports/ProfitAndLossController.php +++ b/app/Http/Controllers/Reports/ProfitAndLossController.php @@ -11,14 +11,14 @@ namespace App\Http\Controllers\Reports; -use App\Models\Client; -use Illuminate\Http\Response; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; -use App\Jobs\Report\PreviewReport; -use App\Services\Report\ProfitLoss; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\ProfitLossRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Models\Client; +use App\Services\Report\ProfitLoss; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\Response; class ProfitAndLossController extends BaseController { diff --git a/app/Http/Controllers/Reports/TaxSummaryReportController.php b/app/Http/Controllers/Reports/TaxSummaryReportController.php index 08b978a0037d..590234159f7a 100644 --- a/app/Http/Controllers/Reports/TaxSummaryReportController.php +++ b/app/Http/Controllers/Reports/TaxSummaryReportController.php @@ -11,12 +11,12 @@ namespace App\Http\Controllers\Reports; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; -use App\Jobs\Report\PreviewReport; use App\Http\Controllers\BaseController; -use App\Services\Report\TaxSummaryReport; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Services\Report\TaxSummaryReport; +use App\Utils\Traits\MakesHash; class TaxSummaryReportController extends BaseController { diff --git a/app/Http/Controllers/Reports/UserSalesReportController.php b/app/Http/Controllers/Reports/UserSalesReportController.php index c26e7dd35d3e..cb904ad76783 100644 --- a/app/Http/Controllers/Reports/UserSalesReportController.php +++ b/app/Http/Controllers/Reports/UserSalesReportController.php @@ -11,12 +11,12 @@ namespace App\Http\Controllers\Reports; -use App\Utils\Traits\MakesHash; -use App\Jobs\Report\SendToAdmin; -use App\Jobs\Report\PreviewReport; use App\Http\Controllers\BaseController; -use App\Services\Report\UserSalesReport; use App\Http\Requests\Report\GenericReportRequest; +use App\Jobs\Report\PreviewReport; +use App\Jobs\Report\SendToAdmin; +use App\Services\Report\UserSalesReport; +use App\Utils\Traits\MakesHash; class UserSalesReportController extends BaseController { diff --git a/app/Http/Controllers/SubdomainController.php b/app/Http/Controllers/SubdomainController.php index 910662d618cd..3800935ac85c 100644 --- a/app/Http/Controllers/SubdomainController.php +++ b/app/Http/Controllers/SubdomainController.php @@ -27,7 +27,7 @@ class SubdomainController extends BaseController public function index() { if (!MultiDB::checkDomainAvailable(request()->input('subdomain'))) { - return response()->json(['message' => ctrans('texts.subdomain_is_not_available')], 401); + return response()->json(['message' => ctrans('texts.subdomain_is_not_available')], 401); } return response()->json(['message' => 'Domain available'], 200); diff --git a/app/Http/Controllers/TaskController.php b/app/Http/Controllers/TaskController.php index dd7200cf1fa0..f3b0f37549dd 100644 --- a/app/Http/Controllers/TaskController.php +++ b/app/Http/Controllers/TaskController.php @@ -11,31 +11,31 @@ namespace App\Http\Controllers; -use App\Models\Task; -use App\Utils\Ninja; -use App\Models\Account; -use App\Models\TaskStatus; -use App\Factory\TaskFactory; -use App\Filters\TaskFilters; -use Illuminate\Http\Response; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\Uploadable; -use App\Utils\Traits\BulkOptions; use App\Events\Task\TaskWasCreated; use App\Events\Task\TaskWasUpdated; -use App\Repositories\TaskRepository; -use App\Utils\Traits\SavesDocuments; -use App\Transformers\TaskTransformer; -use App\Services\Template\TemplateAction; +use App\Factory\TaskFactory; +use App\Filters\TaskFilters; use App\Http\Requests\Task\BulkTaskRequest; +use App\Http\Requests\Task\CreateTaskRequest; +use App\Http\Requests\Task\DestroyTaskRequest; use App\Http\Requests\Task\EditTaskRequest; use App\Http\Requests\Task\ShowTaskRequest; use App\Http\Requests\Task\SortTaskRequest; use App\Http\Requests\Task\StoreTaskRequest; -use App\Http\Requests\Task\CreateTaskRequest; use App\Http\Requests\Task\UpdateTaskRequest; use App\Http\Requests\Task\UploadTaskRequest; -use App\Http\Requests\Task\DestroyTaskRequest; +use App\Models\Account; +use App\Models\Task; +use App\Models\TaskStatus; +use App\Repositories\TaskRepository; +use App\Services\Template\TemplateAction; +use App\Transformers\TaskTransformer; +use App\Utils\Ninja; +use App\Utils\Traits\BulkOptions; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\SavesDocuments; +use App\Utils\Traits\Uploadable; +use Illuminate\Http\Response; /** * Class TaskController. diff --git a/app/Http/Controllers/VendorPortal/PurchaseOrderController.php b/app/Http/Controllers/VendorPortal/PurchaseOrderController.php index fb70c248b793..7ed0ffdcaa03 100644 --- a/app/Http/Controllers/VendorPortal/PurchaseOrderController.php +++ b/app/Http/Controllers/VendorPortal/PurchaseOrderController.php @@ -11,23 +11,23 @@ namespace App\Http\Controllers\VendorPortal; -use App\Utils\Ninja; -use Illuminate\View\View; -use App\Models\PurchaseOrder; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\MakesDates; -use App\Jobs\Entity\CreateRawPdf; -use App\Http\Controllers\Controller; -use App\Jobs\Invoice\InjectSignature; -use Illuminate\Support\Facades\Cache; -use Illuminate\Contracts\View\Factory; -use App\Models\PurchaseOrderInvitation; use App\Events\Misc\InvitationWasViewed; -use App\Events\PurchaseOrder\PurchaseOrderWasViewed; use App\Events\PurchaseOrder\PurchaseOrderWasAccepted; +use App\Events\PurchaseOrder\PurchaseOrderWasViewed; +use App\Http\Controllers\Controller; +use App\Http\Requests\VendorPortal\PurchaseOrders\ProcessPurchaseOrdersInBulkRequest; use App\Http\Requests\VendorPortal\PurchaseOrders\ShowPurchaseOrderRequest; use App\Http\Requests\VendorPortal\PurchaseOrders\ShowPurchaseOrdersRequest; -use App\Http\Requests\VendorPortal\PurchaseOrders\ProcessPurchaseOrdersInBulkRequest; +use App\Jobs\Entity\CreateRawPdf; +use App\Jobs\Invoice\InjectSignature; +use App\Models\PurchaseOrder; +use App\Models\PurchaseOrderInvitation; +use App\Utils\Ninja; +use App\Utils\Traits\MakesDates; +use App\Utils\Traits\MakesHash; +use Illuminate\Contracts\View\Factory; +use Illuminate\Support\Facades\Cache; +use Illuminate\View\View; class PurchaseOrderController extends Controller { diff --git a/app/Http/Middleware/Locale.php b/app/Http/Middleware/Locale.php index 3cbf90217dc7..253c442360ac 100644 --- a/app/Http/Middleware/Locale.php +++ b/app/Http/Middleware/Locale.php @@ -67,9 +67,9 @@ class Locale * @return mixed */ public function handle($request, Closure $next) - { + { /*LOCALE SET */ - if ($request->has('lang') && in_array($request->input('lang','en'), $this->locales) ) { + if ($request->has('lang') && in_array($request->input('lang', 'en'), $this->locales)) { $locale = $request->input('lang'); App::setLocale($locale); } elseif (auth()->guard('contact')->user()) { diff --git a/app/Http/Middleware/VendorLocale.php b/app/Http/Middleware/VendorLocale.php index 6da86375ad0a..5fd327f00bba 100644 --- a/app/Http/Middleware/VendorLocale.php +++ b/app/Http/Middleware/VendorLocale.php @@ -17,48 +17,48 @@ use Illuminate\Support\Facades\App; class VendorLocale { - private array $locales = [ - 'en', - 'it', - 'de', - 'fr', - 'pt_BR', - 'nl', - 'es', - 'nb_NO', - 'da', - 'ja', - 'sv', - 'es_ES', - 'fr_CA', - 'lt', - 'pl', - 'cs', - 'hr', - 'sq', - 'el', - 'en_GB', - 'pt_PT', - 'sl', - 'fi', - 'ro', - 'tr_TR', - 'th', - 'mk_MK', - 'zh_TW', - 'ru_RU', - 'ar', - 'fa', - 'lv_LV', - 'sr', - 'sk', - 'et', - 'bg', - 'he', - 'km_KH', - 'hu', - 'fr_CH', - ]; + private array $locales = [ + 'en', + 'it', + 'de', + 'fr', + 'pt_BR', + 'nl', + 'es', + 'nb_NO', + 'da', + 'ja', + 'sv', + 'es_ES', + 'fr_CA', + 'lt', + 'pl', + 'cs', + 'hr', + 'sq', + 'el', + 'en_GB', + 'pt_PT', + 'sl', + 'fi', + 'ro', + 'tr_TR', + 'th', + 'mk_MK', + 'zh_TW', + 'ru_RU', + 'ar', + 'fa', + 'lv_LV', + 'sr', + 'sk', + 'et', + 'bg', + 'he', + 'km_KH', + 'hu', + 'fr_CH', + ]; /** * Handle an incoming request. * @@ -74,7 +74,7 @@ class VendorLocale } /*LOCALE SET */ - if ($request->has('lang') && in_array($request->input('lang','en'), $this->locales) ) { + if ($request->has('lang') && in_array($request->input('lang', 'en'), $this->locales)) { $locale = $request->input('lang'); App::setLocale($locale); } elseif (auth()->guard('vendor')->user()) { diff --git a/app/Http/Requests/CompanyGateway/StoreCompanyGatewayRequest.php b/app/Http/Requests/CompanyGateway/StoreCompanyGatewayRequest.php index d007de24275f..26b08f85929d 100644 --- a/app/Http/Requests/CompanyGateway/StoreCompanyGatewayRequest.php +++ b/app/Http/Requests/CompanyGateway/StoreCompanyGatewayRequest.php @@ -11,7 +11,6 @@ namespace App\Http\Requests\CompanyGateway; -use App\DataMapper\FeesAndLimits; use App\Http\Requests\Request; use App\Http\ValidationRules\ValidCompanyGatewayFeesAndLimitsRule; use App\Models\Gateway; diff --git a/app/Http/Requests/Design/UpdateDesignRequest.php b/app/Http/Requests/Design/UpdateDesignRequest.php index f51185e4b8cd..ec5cb5dece4c 100644 --- a/app/Http/Requests/Design/UpdateDesignRequest.php +++ b/app/Http/Requests/Design/UpdateDesignRequest.php @@ -11,8 +11,8 @@ namespace App\Http\Requests\Design; -use App\Models\Account; use App\Http\Requests\Request; +use App\Models\Account; use App\Utils\Traits\ChecksEntityStatus; class UpdateDesignRequest extends Request diff --git a/app/Http/Requests/Email/SendEmailRequest.php b/app/Http/Requests/Email/SendEmailRequest.php index 7ab733014f5d..69eb19f90167 100644 --- a/app/Http/Requests/Email/SendEmailRequest.php +++ b/app/Http/Requests/Email/SendEmailRequest.php @@ -74,12 +74,12 @@ class SendEmailRequest extends Request $input['entity'] = "App\Models\\".ucfirst(Str::camel($input['entity'])); } - if(isset($input['cc_email'])){ - $input['cc_email'] = collect(explode(",", $input['cc_email']))->map(function($email){ + if(isset($input['cc_email'])) { + $input['cc_email'] = collect(explode(",", $input['cc_email']))->map(function ($email) { return trim($email); - })->filter(function($email){ + })->filter(function ($email) { return filter_var($email, FILTER_VALIDATE_EMAIL); - })->slice(0,4)->toArray(); + })->slice(0, 4)->toArray(); } $this->replace($input); diff --git a/app/Http/Requests/Invoice/BulkInvoiceRequest.php b/app/Http/Requests/Invoice/BulkInvoiceRequest.php index e7d947d6fc93..c46fe6db8069 100644 --- a/app/Http/Requests/Invoice/BulkInvoiceRequest.php +++ b/app/Http/Requests/Invoice/BulkInvoiceRequest.php @@ -12,7 +12,6 @@ namespace App\Http\Requests\Invoice; use App\Http\Requests\Request; -use App\Models\Payment; class BulkInvoiceRequest extends Request { diff --git a/app/Http/Requests/Payment/StorePaymentRequest.php b/app/Http/Requests/Payment/StorePaymentRequest.php index 75769fda1a5f..efc9aeca14e4 100644 --- a/app/Http/Requests/Payment/StorePaymentRequest.php +++ b/app/Http/Requests/Payment/StorePaymentRequest.php @@ -97,7 +97,7 @@ class StorePaymentRequest extends Request } if (! isset($input['idempotency_key'])) { - $input['idempotency_key'] = substr(sha1(json_encode($input)).time()."{$input['date']}{$input['amount']}{$user->id}",0,64); + $input['idempotency_key'] = substr(sha1(json_encode($input)).time()."{$input['date']}{$input['amount']}{$user->id}", 0, 64); } $this->replace($input); diff --git a/app/Http/Requests/Preview/PreviewPurchaseOrderRequest.php b/app/Http/Requests/Preview/PreviewPurchaseOrderRequest.php index e7075e1a0bb8..4ec935f7de4e 100644 --- a/app/Http/Requests/Preview/PreviewPurchaseOrderRequest.php +++ b/app/Http/Requests/Preview/PreviewPurchaseOrderRequest.php @@ -11,12 +11,12 @@ namespace App\Http\Requests\Preview; -use App\Models\Vendor; -use App\Models\PurchaseOrder; use App\Http\Requests\Request; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\CleanLineItems; +use App\Models\PurchaseOrder; use App\Models\PurchaseOrderInvitation; +use App\Models\Vendor; +use App\Utils\Traits\CleanLineItems; +use App\Utils\Traits\MakesHash; class PreviewPurchaseOrderRequest extends Request { diff --git a/app/Http/Requests/Task/StoreTaskRequest.php b/app/Http/Requests/Task/StoreTaskRequest.php index d9ddff121d4e..12d61e9441cf 100644 --- a/app/Http/Requests/Task/StoreTaskRequest.php +++ b/app/Http/Requests/Task/StoreTaskRequest.php @@ -56,8 +56,9 @@ class StoreTaskRequest extends Request $rules['time_log'] = ['bail',function ($attribute, $values, $fail) { - if(is_string($values)) + if(is_string($values)) { $values = json_decode($values, true); + } if(!is_array($values)) { $fail('The '.$attribute.' must be a valid array.'); @@ -119,7 +120,7 @@ class StoreTaskRequest extends Request } } - if(!isset($input['time_log']) || empty($input['time_log']) || $input['time_log'] == '{}'){ + if(!isset($input['time_log']) || empty($input['time_log']) || $input['time_log'] == '{}') { $input['time_log'] = json_encode([]); } diff --git a/app/Import/Transformer/BaseTransformer.php b/app/Import/Transformer/BaseTransformer.php index 843330ac87db..03928b2fa698 100644 --- a/app/Import/Transformer/BaseTransformer.php +++ b/app/Import/Transformer/BaseTransformer.php @@ -77,7 +77,7 @@ class BaseTransformer } public function getString($data, $field) - { + { return isset($data[$field]) && $data[$field] ? trim($data[$field]) : ''; } @@ -677,8 +677,9 @@ class BaseTransformer */ public function getProjectId($name, $clientId = null) { - if(strlen($name) == 0) + if(strlen($name) == 0) { return null; + } $project = Project::query()->where('company_id', $this->company->id) ->where('is_deleted', false) diff --git a/app/Import/Transformer/Csv/TaskTransformer.php b/app/Import/Transformer/Csv/TaskTransformer.php index 9ebf8c6d449a..690eb1ec8790 100644 --- a/app/Import/Transformer/Csv/TaskTransformer.php +++ b/app/Import/Transformer/Csv/TaskTransformer.php @@ -11,8 +11,8 @@ namespace App\Import\Transformer\Csv; -use App\Models\TaskStatus; use App\Import\Transformer\BaseTransformer; +use App\Models\TaskStatus; /** * Class TaskTransformer. @@ -29,10 +29,11 @@ class TaskTransformer extends BaseTransformer { $this->stubbed_timestamp = time(); - if(count($task_items_data) == count($task_items_data, COUNT_RECURSIVE)) + if(count($task_items_data) == count($task_items_data, COUNT_RECURSIVE)) { $task_data = $task_items_data; - else + } else { $task_data = reset($task_items_data); + } $clientId = $this->getClient( $this->getString($task_data, 'client.name'), @@ -79,12 +80,13 @@ class TaskTransformer extends BaseTransformer $notes = $item['task.notes'] ?? ''; - if(isset($item['task.is_billable']) && is_string($item['task.is_billable']) && in_array($item['task.is_billable'], ['yes', 'true', '1'])) + if(isset($item['task.is_billable']) && is_string($item['task.is_billable']) && in_array($item['task.is_billable'], ['yes', 'true', '1'])) { $is_billable = true; - elseif(isset($item['task.is_billable']) && is_bool($item['task.is_billable'])) + } elseif(isset($item['task.is_billable']) && is_bool($item['task.is_billable'])) { $is_billable = $item['task.is_billable']; - else + } else { $is_billable = false; + } if(isset($item['task.start_date']) && isset($item['task.end_date'])) { @@ -148,8 +150,7 @@ class TaskTransformer extends BaseTransformer private function getTaskStatusId($item): ?int { - if(isset($item['task.status'])) - { + if(isset($item['task.status'])) { $name = strtolower(trim($item['task.status'])); $ts = TaskStatus::query()->where('company_id', $this->company->id) @@ -159,9 +160,10 @@ class TaskTransformer extends BaseTransformer ]) ->first(); - if($ts) - return $ts->id; - } + if($ts) { + return $ts->id; + } + } return TaskStatus::where('company_id', $this->company->id) ->where('is_deleted', false) diff --git a/app/Jobs/Company/CompanyImport.php b/app/Jobs/Company/CompanyImport.php index fc5219b31901..7c84d721b1e9 100644 --- a/app/Jobs/Company/CompanyImport.php +++ b/app/Jobs/Company/CompanyImport.php @@ -16,7 +16,6 @@ use App\Exceptions\NonExistingMigrationFile; use App\Factory\ClientContactFactory; use App\Jobs\Mail\NinjaMailerJob; use App\Jobs\Mail\NinjaMailerObject; -use App\Jobs\Ninja\TaskScheduler; use App\Libraries\MultiDB; use App\Mail\Import\CompanyImportFailure; use App\Mail\Import\ImportCompleted; @@ -218,7 +217,7 @@ class CompanyImport implements ShouldQueue 'baseline' => [], '5.7.35' => [ Payment::class => [ - 'refund_meta', + 'refund_meta', 'category_id', ], User::class => [ @@ -462,7 +461,7 @@ class CompanyImport implements ShouldQueue $this->company->save(); - return $this; + return $this; } private function purgeCompanyData() @@ -1367,8 +1366,9 @@ class CompanyImport implements ShouldQueue private function filterVersionProps($class, array $obj_array): array { - if($this->current_app_version == $this->import_version) + if($this->current_app_version == $this->import_version) { return $obj_array; + } $version_index = 0; $index = 0; @@ -1390,9 +1390,9 @@ class CompanyImport implements ShouldQueue return $collection->slice($version_index)->pluck($class)->filter(); }); - return collect($obj_array)->diffKeys($filters->flatten()->flip())->toArray(); + return collect($obj_array)->diffKeys($filters->flatten()->flip())->toArray(); - } + } private function genericNewClassImport($class, $unset, $transforms, $object_property) { @@ -1415,7 +1415,7 @@ class CompanyImport implements ShouldQueue $obj_array['gateway_key'] = 'd14dd26a37cecc30fdd65700bfb55b23'; } - if(!isset($obj_array['fees_and_limits'])){ + if(!isset($obj_array['fees_and_limits'])) { $obj_array['fees_and_limits'] = \json_encode([]); } } @@ -1467,16 +1467,16 @@ class CompanyImport implements ShouldQueue /** @var \stdClass $parameters */ $parameters = $obj_array['parameters']; - if(isset($parameters->clients)){ + if(isset($parameters->clients)) { $parameters->clients = - collect($parameters->clients)->map(function ($client_hash){ + collect($parameters->clients)->map(function ($client_hash) { return $this->encodePrimaryKey($this->transformId('clients', $client_hash)); })->toArray(); } - if(isset($parameters->entity_id)){ + if(isset($parameters->entity_id)) { $parameters->entity_id = $this->encodePrimaryKey($this->transformId($parameters->entity."s", $parameters->entity_id)); } @@ -1485,7 +1485,7 @@ class CompanyImport implements ShouldQueue $new_obj = new $class(); $new_obj->company_id = $this->company->id; - $obj_array = $this->filterVersionProps($class,$obj_array); + $obj_array = $this->filterVersionProps($class, $obj_array); $new_obj->fill($obj_array); diff --git a/app/Jobs/Company/CreateCompany.php b/app/Jobs/Company/CreateCompany.php index 984c29993cd2..5ca76e3071ed 100644 --- a/app/Jobs/Company/CreateCompany.php +++ b/app/Jobs/Company/CreateCompany.php @@ -14,7 +14,6 @@ namespace App\Jobs\Company; use App\DataMapper\ClientRegistrationFields; use App\DataMapper\CompanySettings; use App\DataMapper\Tax\TaxModel; -use App\Factory\TaxRateFactory; use App\Libraries\MultiDB; use App\Models\Company; use App\Models\Country; diff --git a/app/Jobs/Cron/UpdateCalculatedFields.php b/app/Jobs/Cron/UpdateCalculatedFields.php index 77a629fce31d..6413a36a90bc 100644 --- a/app/Jobs/Cron/UpdateCalculatedFields.php +++ b/app/Jobs/Cron/UpdateCalculatedFields.php @@ -79,9 +79,9 @@ class UpdateCalculatedFields $project->tasks->each(function ($task) use (&$duration) { - if(is_iterable(json_decode($task->time_log) )) { + if(is_iterable(json_decode($task->time_log))) { - foreach(json_decode($task->time_log) as $log) { + foreach(json_decode($task->time_log) as $log) { $start_time = $log[0]; $end_time = $log[1] == 0 ? time() : $log[1]; diff --git a/app/Jobs/Entity/CreateRawPdf.php b/app/Jobs/Entity/CreateRawPdf.php index 57e214784071..47a8f288b6b0 100644 --- a/app/Jobs/Entity/CreateRawPdf.php +++ b/app/Jobs/Entity/CreateRawPdf.php @@ -11,23 +11,23 @@ namespace App\Jobs\Entity; -use App\Models\Quote; -use App\Models\Credit; -use App\Models\Invoice; -use App\Models\PurchaseOrder; -use App\Models\QuoteInvitation; -use App\Utils\Traits\MakesHash; -use App\Models\CreditInvitation; -use App\Models\RecurringInvoice; -use App\Services\Pdf\PdfService; -use App\Models\InvoiceInvitation; -use App\Utils\Traits\Pdf\PdfMaker; -use App\Utils\Traits\NumberFormatter; -use App\Utils\Traits\MakesInvoiceHtml; -use App\Models\PurchaseOrderInvitation; -use App\Utils\Traits\Pdf\PageNumbering; use App\Exceptions\FilePermissionsFailure; +use App\Models\Credit; +use App\Models\CreditInvitation; +use App\Models\Invoice; +use App\Models\InvoiceInvitation; +use App\Models\PurchaseOrder; +use App\Models\PurchaseOrderInvitation; +use App\Models\Quote; +use App\Models\QuoteInvitation; +use App\Models\RecurringInvoice; use App\Models\RecurringInvoiceInvitation; +use App\Services\Pdf\PdfService; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\MakesInvoiceHtml; +use App\Utils\Traits\NumberFormatter; +use App\Utils\Traits\Pdf\PageNumbering; +use App\Utils\Traits\Pdf\PdfMaker; class CreateRawPdf { @@ -63,7 +63,7 @@ class CreateRawPdf } elseif ($invitation instanceof RecurringInvoiceInvitation) { $this->entity = $invitation->recurring_invoice; $this->entity_string = 'recurring_invoice'; - } elseif ($invitation instanceof PurchaseOrderInvitation){ + } elseif ($invitation instanceof PurchaseOrderInvitation) { $this->entity = $invitation->purchase_order; $this->entity_string = 'purchase_order'; } @@ -72,8 +72,9 @@ class CreateRawPdf private function resolveType(): string { - if($this->type) + if($this->type) { return $this->type; + } $type = 'product'; diff --git a/app/Jobs/Expense/VendorExpenseNotify.php b/app/Jobs/Expense/VendorExpenseNotify.php index 16a6b83a33d0..805bb5dfe731 100644 --- a/app/Jobs/Expense/VendorExpenseNotify.php +++ b/app/Jobs/Expense/VendorExpenseNotify.php @@ -11,21 +11,21 @@ namespace App\Jobs\Expense; +use App\Libraries\MultiDB; +use App\Models\Activity; +use App\Models\Expense; +use App\Models\VendorContact; +use App\Repositories\ActivityRepository; +use App\Services\Email\Email; +use App\Services\Email\EmailObject; use App\Utils\Ninja; use App\Utils\Number; -use App\Models\Expense; -use App\Models\Activity; -use App\Libraries\MultiDB; -use App\Models\VendorContact; -use App\Services\Email\Email; -use Illuminate\Bus\Queueable; -use App\Services\Email\EmailObject; -use Illuminate\Queue\SerializesModels; -use App\Repositories\ActivityRepository; use App\Utils\Traits\MakesDates; -use Illuminate\Queue\InteractsWithQueue; +use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; +use Illuminate\Queue\InteractsWithQueue; +use Illuminate\Queue\SerializesModels; class VendorExpenseNotify implements ShouldQueue { @@ -41,9 +41,9 @@ class VendorExpenseNotify implements ShouldQueue { MultiDB::setDB($this->db); - $this->expense->vendor->contacts->filter(function(VendorContact $contact){ + $this->expense->vendor->contacts->filter(function (VendorContact $contact) { return $contact->send_email && $contact->email; - })->each(function(VendorContact $contact){ + })->each(function (VendorContact $contact) { $this->notify($contact); }); } @@ -96,4 +96,4 @@ class VendorExpenseNotify implements ShouldQueue $activity_repo->save($fields, $this->expense, Ninja::eventVars()); } -} \ No newline at end of file +} diff --git a/app/Jobs/Ledger/ClientLedgerBalanceUpdate.php b/app/Jobs/Ledger/ClientLedgerBalanceUpdate.php index 58f41ff61221..aee2b08e1aa7 100644 --- a/app/Jobs/Ledger/ClientLedgerBalanceUpdate.php +++ b/app/Jobs/Ledger/ClientLedgerBalanceUpdate.php @@ -89,7 +89,7 @@ class ClientLedgerBalanceUpdate implements ShouldQueue $company_ledger->balance = ($parent_ledger ? $parent_ledger->balance : 0) + $company_ledger->adjustment; $company_ledger->save(); - }); + }); // nlog("finished job {$uuid}"); } diff --git a/app/Jobs/Ledger/UpdateLedger.php b/app/Jobs/Ledger/UpdateLedger.php index 48605c75a766..308a05367505 100644 --- a/app/Jobs/Ledger/UpdateLedger.php +++ b/app/Jobs/Ledger/UpdateLedger.php @@ -14,11 +14,11 @@ namespace App\Jobs\Ledger; use App\Libraries\MultiDB; use App\Models\CompanyLedger; use Illuminate\Bus\Queueable; -use Illuminate\Queue\SerializesModels; -use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; +use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\Middleware\WithoutOverlapping; +use Illuminate\Queue\SerializesModels; //@deprecated class UpdateLedger implements ShouldQueue @@ -51,20 +51,21 @@ class UpdateLedger implements ShouldQueue nlog($cl->company_ledgerable->company_ledger()->count()); - if(!$cl) + if(!$cl) { return; + } $entity = $cl->company_ledgerable; $balance = $entity->calc()->getBalance(); $cl->adjustment = $ledger_item ? $balance : ($balance - $this->start_amount); - $parent_ledger = CompanyLedger::query() - ->where('id', '<', $cl->id) - ->where('company_id', $cl->company_id) - ->where('client_id', $cl->client_id) - ->where('balance', '!=', 0) - ->orderBy('id', 'DESC') - ->first(); + $parent_ledger = CompanyLedger::query() + ->where('id', '<', $cl->id) + ->where('company_id', $cl->company_id) + ->where('client_id', $cl->client_id) + ->where('balance', '!=', 0) + ->orderBy('id', 'DESC') + ->first(); $cl->balance = ($parent_ledger ? $parent_ledger->balance : 0) + $cl->adjustment; $cl->save(); diff --git a/app/Jobs/Mail/NinjaMailerJob.php b/app/Jobs/Mail/NinjaMailerJob.php index 3b8211f4ba86..60c3b7fbd81c 100644 --- a/app/Jobs/Mail/NinjaMailerJob.php +++ b/app/Jobs/Mail/NinjaMailerJob.php @@ -24,7 +24,6 @@ use App\Models\Invoice; use App\Models\Payment; use App\Models\SystemLog; use App\Models\User; -use App\Repositories\ActivityRepository; use App\Utils\Ninja; use App\Utils\Traits\MakesHash; use GuzzleHttp\Exception\ClientException; diff --git a/app/Jobs/Ninja/SystemMaintenance.php b/app/Jobs/Ninja/SystemMaintenance.php index 7b5243016fb2..30e60bda13b5 100644 --- a/app/Jobs/Ninja/SystemMaintenance.php +++ b/app/Jobs/Ninja/SystemMaintenance.php @@ -159,4 +159,4 @@ class SystemMaintenance implements ShouldQueue // } -} \ No newline at end of file +} diff --git a/app/Jobs/Payment/EmailPayment.php b/app/Jobs/Payment/EmailPayment.php index 31e83bc9efff..455b4161ca35 100644 --- a/app/Jobs/Payment/EmailPayment.php +++ b/app/Jobs/Payment/EmailPayment.php @@ -111,7 +111,7 @@ class EmailPayment implements ShouldQueue $invoice = $this->payment->invoices->first(); - $invoice->invitations->each(function ($invite) use ($email_builder){ + $invoice->invitations->each(function ($invite) use ($email_builder) { $nmo = new NinjaMailerObject; $nmo->mailable = new TemplateEmail($email_builder, $invite->contact, $invite); diff --git a/app/Jobs/PurchaseOrder/ZipPurchaseOrders.php b/app/Jobs/PurchaseOrder/ZipPurchaseOrders.php index 10699dcbc115..9955f8925873 100644 --- a/app/Jobs/PurchaseOrder/ZipPurchaseOrders.php +++ b/app/Jobs/PurchaseOrder/ZipPurchaseOrders.php @@ -11,21 +11,21 @@ namespace App\Jobs\PurchaseOrder; -use App\Models\User; -use App\Models\Company; -use App\Libraries\MultiDB; -use App\Jobs\Util\UnlinkFile; -use Illuminate\Bus\Queueable; use App\Jobs\Entity\CreateRawPdf; use App\Jobs\Mail\NinjaMailerJob; use App\Jobs\Mail\NinjaMailerObject; +use App\Jobs\Util\UnlinkFile; +use App\Libraries\MultiDB; use App\Mail\DownloadPurchaseOrders; -use Illuminate\Queue\SerializesModels; +use App\Models\Company; use App\Models\PurchaseOrderInvitation; -use Illuminate\Support\Facades\Storage; -use Illuminate\Queue\InteractsWithQueue; +use App\Models\User; +use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; +use Illuminate\Queue\InteractsWithQueue; +use Illuminate\Queue\SerializesModels; +use Illuminate\Support\Facades\Storage; class ZipPurchaseOrders implements ShouldQueue { diff --git a/app/Jobs/Report/PreviewReport.php b/app/Jobs/Report/PreviewReport.php index 43fd133e888e..6fd2f4fb0406 100644 --- a/app/Jobs/Report/PreviewReport.php +++ b/app/Jobs/Report/PreviewReport.php @@ -39,10 +39,11 @@ class PreviewReport implements ShouldQueue /** @var \App\Export\CSV\CreditExport $export */ $export = new $this->report_class($this->company, $this->request); - if(isset($this->request['output']) && $this->request['output'] == 'json') + if(isset($this->request['output']) && $this->request['output'] == 'json') { $report = $export->returnJson(); - else + } else { $report = $export->run(); + } // nlog($report); diff --git a/app/Jobs/Util/Import.php b/app/Jobs/Util/Import.php index 1fa0d357d6c6..13b2448093c8 100644 --- a/app/Jobs/Util/Import.php +++ b/app/Jobs/Util/Import.php @@ -364,23 +364,27 @@ class Import implements ShouldQueue if (isset($data['plan_expires'])) { unset($data['plan_expires']); } - } - else { + } else { - if(isset($data['plan'])) + if(isset($data['plan'])) { $account->plan = $data['plan']; + } - if (isset($data['plan_term'])) + if (isset($data['plan_term'])) { $account->plan_term = $data['plan_term']; + } - if (isset($data['plan_paid'])) + if (isset($data['plan_paid'])) { $account->plan_paid = $data['plan_paid']; + } - if (isset($data['plan_started'])) + if (isset($data['plan_started'])) { $account->plan_started = $data['plan_started']; + } - if (isset($data['plan_expires'])) + if (isset($data['plan_expires'])) { $account->plan_expires = $data['plan_expires']; + } } diff --git a/app/Jobs/Util/VersionCheck.php b/app/Jobs/Util/VersionCheck.php index 76b177836eba..f8e8219d73e7 100644 --- a/app/Jobs/Util/VersionCheck.php +++ b/app/Jobs/Util/VersionCheck.php @@ -11,20 +11,20 @@ namespace App\Jobs\Util; -use Carbon\Carbon; -use App\Utils\Ninja; -use App\Models\Client; -use App\Models\Vendor; -use App\Models\Account; -use Illuminate\Support\Str; -use App\Models\ClientContact; -use Illuminate\Bus\Queueable; use App\Factory\ClientContactFactory; use App\Factory\VendorContactFactory; -use Illuminate\Queue\SerializesModels; -use Illuminate\Queue\InteractsWithQueue; +use App\Models\Account; +use App\Models\Client; +use App\Models\ClientContact; +use App\Models\Vendor; +use App\Utils\Ninja; +use Carbon\Carbon; +use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; +use Illuminate\Queue\InteractsWithQueue; +use Illuminate\Queue\SerializesModels; +use Illuminate\Support\Str; class VersionCheck implements ShouldQueue { @@ -81,7 +81,7 @@ class VersionCheck implements ShouldQueue $c->send_email = false; $c->saveQuietly(); - }); + }); ClientContact::query() ->whereNull('contact_key') @@ -91,7 +91,7 @@ class VersionCheck implements ShouldQueue Client::doesntHave('contacts') ->cursor() - ->each(function ($client){ + ->each(function ($client) { $new_contact = ClientContactFactory::create($client->company_id, $client->user_id); $new_contact->client_id = $client->id; @@ -104,14 +104,14 @@ class VersionCheck implements ShouldQueue Vendor::doesntHave('contacts') ->cursor() - ->each(function ($vendor){ + ->each(function ($vendor) { $new_contact = VendorContactFactory::create($vendor->company_id, $vendor->user_id); $new_contact->vendor_id = $vendor->id; $new_contact->contact_key = Str::random(40); $new_contact->is_primary = true; $new_contact->save(); - }); + }); } diff --git a/app/Jobs/Vendor/CreatePurchaseOrderPdf.php b/app/Jobs/Vendor/CreatePurchaseOrderPdf.php index 59777bed2a91..f4669a7b49bd 100644 --- a/app/Jobs/Vendor/CreatePurchaseOrderPdf.php +++ b/app/Jobs/Vendor/CreatePurchaseOrderPdf.php @@ -11,29 +11,29 @@ namespace App\Jobs\Vendor; -use App\Utils\Ninja; -use App\Models\Design; -use App\Libraries\MultiDB; -use Illuminate\Bus\Queueable; -use App\Utils\Traits\MakesHash; -use App\Utils\VendorHtmlEngine; -use App\Services\Pdf\PdfService; -use App\Utils\PhantomJS\Phantom; -use App\Utils\HostedPDF\NinjaPdf; -use App\Utils\Traits\Pdf\PdfMaker; -use Illuminate\Support\Facades\App; -use App\Utils\Traits\NumberFormatter; -use App\Utils\Traits\MakesInvoiceHtml; -use Illuminate\Queue\SerializesModels; -use App\Utils\Traits\Pdf\PageNumbering; -use Illuminate\Support\Facades\Storage; -use Illuminate\Queue\InteractsWithQueue; use App\Exceptions\FilePermissionsFailure; -use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Foundation\Bus\Dispatchable; +use App\Libraries\MultiDB; +use App\Models\Design; +use App\Services\Pdf\PdfService; use App\Services\PdfMaker\Design as PdfDesignModel; use App\Services\PdfMaker\Design as PdfMakerDesign; use App\Services\PdfMaker\PdfMaker as PdfMakerService; +use App\Utils\HostedPDF\NinjaPdf; +use App\Utils\Ninja; +use App\Utils\PhantomJS\Phantom; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\MakesInvoiceHtml; +use App\Utils\Traits\NumberFormatter; +use App\Utils\Traits\Pdf\PageNumbering; +use App\Utils\Traits\Pdf\PdfMaker; +use App\Utils\VendorHtmlEngine; +use Illuminate\Bus\Queueable; +use Illuminate\Contracts\Queue\ShouldQueue; +use Illuminate\Foundation\Bus\Dispatchable; +use Illuminate\Queue\InteractsWithQueue; +use Illuminate\Queue\SerializesModels; +use Illuminate\Support\Facades\App; +use Illuminate\Support\Facades\Storage; /** @deprecated 26-10-2023 5.7.30x */ class CreatePurchaseOrderPdf implements ShouldQueue diff --git a/app/Libraries/OAuth/Providers/Google.php b/app/Libraries/OAuth/Providers/Google.php index ce55554c983a..c2b5249313ef 100644 --- a/app/Libraries/OAuth/Providers/Google.php +++ b/app/Libraries/OAuth/Providers/Google.php @@ -3,6 +3,7 @@ namespace App\Libraries\OAuth\Providers; use Google_Client; + class Google implements ProviderInterface { public function getTokenResponse($token) @@ -38,8 +39,7 @@ class Google implements ProviderInterface try { $userInfo = $oauth2->userinfo->get(); - } - catch (\Exception $e) { + } catch (\Exception $e) { return false; } diff --git a/app/Listeners/LogResponseReceived.php b/app/Listeners/LogResponseReceived.php index 77dff2029936..28cb12e24fcf 100644 --- a/app/Listeners/LogResponseReceived.php +++ b/app/Listeners/LogResponseReceived.php @@ -11,23 +11,15 @@ namespace App\Listeners; -use App\Utils\Ninja; -use App\Libraries\MultiDB; -use App\Mail\User\UserAdded; -use Illuminate\Support\Carbon; -use App\Jobs\Mail\NinjaMailerJob; -use Illuminate\Support\Facades\App; -use App\Jobs\Mail\NinjaMailerObject; -use Illuminate\Queue\SerializesModels; -use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Broadcasting\InteractsWithSockets; +use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Http\Client\Events\ResponseReceived; +use Illuminate\Queue\SerializesModels; class LogResponseReceived { - use Dispatchable, InteractsWithSockets, SerializesModels; + use Dispatchable, InteractsWithSockets, SerializesModels; /** * Create the event listener. diff --git a/app/Mail/Engine/PurchaseOrderEmailEngine.php b/app/Mail/Engine/PurchaseOrderEmailEngine.php index b1f4a3bb3032..0d5b7e5321fa 100644 --- a/app/Mail/Engine/PurchaseOrderEmailEngine.php +++ b/app/Mail/Engine/PurchaseOrderEmailEngine.php @@ -11,17 +11,17 @@ namespace App\Mail\Engine; -use App\Utils\Ninja; -use App\Utils\Number; -use App\Models\Vendor; +use App\DataMapper\EmailTemplateDefaults; +use App\Jobs\Entity\CreateRawPdf; use App\Models\Account; use App\Models\PurchaseOrder; +use App\Models\Vendor; +use App\Utils\Ninja; +use App\Utils\Number; use App\Utils\Traits\MakesHash; use App\Utils\VendorHtmlEngine; -use App\Jobs\Entity\CreateRawPdf; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\URL; -use App\DataMapper\EmailTemplateDefaults; class PurchaseOrderEmailEngine extends BaseEmailEngine { diff --git a/app/Models/Company.php b/app/Models/Company.php index 9b3096be8bff..8f37c7d063bc 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -11,22 +11,21 @@ namespace App\Models; -use App\Utils\Ninja; use App\Casts\EncryptedCast; -use App\Models\VendorContact; -use App\Utils\Traits\AppSetup; -use App\Utils\Traits\MakesHash; use App\DataMapper\CompanySettings; -use Illuminate\Support\Facades\App; -use Illuminate\Support\Facades\Cache; -use Laracasts\Presenter\PresentableTrait; -use App\Utils\Traits\CompanySettingsSaver; -use Illuminate\Notifications\Notification; use App\Models\Presenters\CompanyPresenter; use App\Services\Company\CompanyService; use App\Services\Notification\NotificationService; -use Illuminate\Database\Eloquent\Relations\HasMany; +use App\Utils\Ninja; +use App\Utils\Traits\AppSetup; +use App\Utils\Traits\CompanySettingsSaver; +use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Notifications\Notification; +use Illuminate\Support\Facades\App; +use Illuminate\Support\Facades\Cache; +use Laracasts\Presenter\PresentableTrait; /** * App\Models\Company diff --git a/app/Models/Document.php b/app/Models/Document.php index 5d4ab5923cb2..08835291f584 100644 --- a/app/Models/Document.php +++ b/app/Models/Document.php @@ -11,7 +11,6 @@ namespace App\Models; -use App\Helpers\Document\WithTypeHelpers; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Facades\Storage; @@ -211,8 +210,9 @@ class Document extends BaseModel $image = $this->getFile(); $catch_image = $image; - if(!extension_loaded('imagick')) + if(!extension_loaded('imagick')) { return $catch_image; + } try { $file = base64_encode($image); @@ -224,8 +224,7 @@ class Document extends BaseModel return $img->getImageBlob(); - } - catch(\Exception $e){ + } catch(\Exception $e) { nlog($e->getMessage()); return $catch_image; diff --git a/app/Models/Gateway.php b/app/Models/Gateway.php index d811ea7ed064..53d628836cc2 100644 --- a/app/Models/Gateway.php +++ b/app/Models/Gateway.php @@ -90,7 +90,7 @@ class Gateway extends StaticModel if ($this->id == 1) { $link = 'http://reseller.authorize.net/application/?id=5560364'; - } elseif (in_array($this->id,[15,60,61])) { + } elseif (in_array($this->id, [15,60,61])) { $link = 'https://www.paypal.com/us/cgi-bin/webscr?cmd=_login-api-run'; } elseif ($this->id == 24) { $link = 'https://www.2checkout.com/referral?r=2c37ac2298'; diff --git a/app/Models/Task.php b/app/Models/Task.php index 332c8a67f582..368eae40d55b 100644 --- a/app/Models/Task.php +++ b/app/Models/Task.php @@ -164,11 +164,13 @@ class Task extends BaseModel public function stringStatus() { - if($this->invoice_id) + if($this->invoice_id) { return '
'.ctrans('texts.invoiced').'
'; + } - if($this->status) + if($this->status) { return '
' . $this->status?->name ?? ''; + } return ''; @@ -255,18 +257,20 @@ class Task extends BaseModel public function processLogs() { - return - collect(json_decode($this->time_log,true))->map(function ($log){ + return + collect(json_decode($this->time_log, true))->map(function ($log) { $parent_entity = $this->client ?? $this->company; - if($log[0]) + if($log[0]) { $log[0] = Carbon::createFromTimestamp($log[0])->format($parent_entity->date_format().' H:i:s'); + } - if($log[1] && $log[1] != 0) + if($log[1] && $log[1] != 0) { $log[1] = Carbon::createFromTimestamp($log[1])->format($parent_entity->date_format().' H:i:s'); - else + } else { $log[1] = ctrans('texts.running'); + } return $log; })->toArray(); @@ -276,28 +280,27 @@ class Task extends BaseModel public function processLogsExpandedNotation() { - return - collect(json_decode($this->time_log,true))->map(function ($log){ + return + collect(json_decode($this->time_log, true))->map(function ($log) { $parent_entity = $this->client ?? $this->company; $logged = []; - if($log[0] && $log[1] !=0 ) { + if($log[0] && $log[1] !=0) { $duration = $log[1] - $log[0]; - } - else { + } else { $duration = 0; } - if($log[0]) + if($log[0]) { $logged['start_date_raw'] = $log[0]; - $logged['start_date'] = Carbon::createFromTimestamp($log[0])->setTimeZone($this->company->timezone()->name)->format($parent_entity->date_format().' H:i:s'); + } + $logged['start_date'] = Carbon::createFromTimestamp($log[0])->setTimeZone($this->company->timezone()->name)->format($parent_entity->date_format().' H:i:s'); if($log[1] && $log[1] != 0) { $logged['end_date_raw'] = $log[1]; $logged['end_date'] = Carbon::createFromTimestamp($log[1])->setTimeZone($this->company->timezone()->name)->format($parent_entity->date_format().' H:i:s'); - } - else{ + } else { $logged['end_date_raw'] = 0; $logged['end_date'] = ctrans('texts.running'); } diff --git a/app/PaymentDrivers/Authorize/AuthorizeCustomer.php b/app/PaymentDrivers/Authorize/AuthorizeCustomer.php index a72fe5efe59d..4dd677aeebf6 100644 --- a/app/PaymentDrivers/Authorize/AuthorizeCustomer.php +++ b/app/PaymentDrivers/Authorize/AuthorizeCustomer.php @@ -99,7 +99,7 @@ class AuthorizeCustomer $client = $client_gateway_token->client; } elseif ($client_contact = ClientContact::where('company_id', $company->id)->where('email', $profile['email'])->first()) { $client = $client_contact->client; - // nlog("found client through contact"); + // nlog("found client through contact"); } else { // nlog("creating client"); diff --git a/app/PaymentDrivers/BaseDriver.php b/app/PaymentDrivers/BaseDriver.php index ad9493865c99..8a324094779f 100644 --- a/app/PaymentDrivers/BaseDriver.php +++ b/app/PaymentDrivers/BaseDriver.php @@ -749,19 +749,19 @@ class BaseDriver extends AbstractPaymentDriver $invoices_string = str_replace(["*","<",">","'",'"'], "-", $invoices_string); -// 2023-11-02 - improve the statement descriptor for string + // 2023-11-02 - improve the statement descriptor for string -$company_name = $this->client->company->present()->name(); -$company_name = str_replace(["*","<",">","'",'"'], "-", $company_name); + $company_name = $this->client->company->present()->name(); + $company_name = str_replace(["*","<",">","'",'"'], "-", $company_name); -if(ctype_digit(substr($company_name, 0, 1))) { - $company_name = "I" . $company_name; -} + if(ctype_digit(substr($company_name, 0, 1))) { + $company_name = "I" . $company_name; + } -$company_name = substr($company_name, 0, 11); -$descriptor = "{$company_name} {$invoices_string}"; -$descriptor = substr($descriptor, 0, 22); -return $descriptor; + $company_name = substr($company_name, 0, 11); + $descriptor = "{$company_name} {$invoices_string}"; + $descriptor = substr($descriptor, 0, 22); + return $descriptor; } /** diff --git a/app/PaymentDrivers/GoCardlessPaymentDriver.php b/app/PaymentDrivers/GoCardlessPaymentDriver.php index 6ab26b96fe1c..00db105fa717 100644 --- a/app/PaymentDrivers/GoCardlessPaymentDriver.php +++ b/app/PaymentDrivers/GoCardlessPaymentDriver.php @@ -406,7 +406,7 @@ class GoCardlessPaymentDriver extends BaseDriver if(!in_array($mandate->status, ['pending_submission', 'submitted', 'active','pending_customer_approval'])) { - // if ($mandate->status !== 'active') { + // if ($mandate->status !== 'active') { throw new \Exception(ctrans('texts.gocardless_mandate_not_ready')); } } catch (\Exception $exception) { diff --git a/app/PaymentDrivers/PayPalPPCPPaymentDriver.php b/app/PaymentDrivers/PayPalPPCPPaymentDriver.php index 2684aaa1cec4..739f80463a7d 100644 --- a/app/PaymentDrivers/PayPalPPCPPaymentDriver.php +++ b/app/PaymentDrivers/PayPalPPCPPaymentDriver.php @@ -21,7 +21,6 @@ use App\Models\SystemLog; use App\Utils\Traits\MakesHash; use Carbon\Carbon; use Illuminate\Support\Facades\Http; -use Omnipay\Omnipay; use Str; class PayPalPPCPPaymentDriver extends BaseDriver @@ -65,7 +64,7 @@ class PayPalPPCPPaymentDriver extends BaseDriver ]; /** - * Return an array of + * Return an array of * enabled gateway payment methods * * @return array @@ -74,9 +73,9 @@ class PayPalPPCPPaymentDriver extends BaseDriver { return collect($this->company_gateway->fees_and_limits) - ->filter(function ($fee){ + ->filter(function ($fee) { return $fee->is_enabled; - })->map(function ($fee, $key){ + })->map(function ($fee, $key) { return (int)$key; })->toArray(); @@ -86,7 +85,7 @@ class PayPalPPCPPaymentDriver extends BaseDriver { $method = PaymentType::PAYPAL; - match($gateway_type_id){ + match($gateway_type_id) { "1" => $method = PaymentType::CREDIT_CARD_OTHER, "3" => $method = PaymentType::PAYPAL, "25" => $method = PaymentType::VENMO, @@ -132,7 +131,7 @@ class PayPalPPCPPaymentDriver extends BaseDriver /** * Initialize the Paypal gateway. - * + * * Attempt to generate and return the access token. * * @return self @@ -145,8 +144,9 @@ class PayPalPPCPPaymentDriver extends BaseDriver $secret = config('ninja.paypal.secret'); $client_id = config('ninja.paypal.client_id'); - if($this->access_token && $this->token_expiry && $this->token_expiry->isFuture()) + if($this->access_token && $this->token_expiry && $this->token_expiry->isFuture()) { return $this; + } $response = Http::withBasicAuth($client_id, $secret) ->withHeaders(['Content-Type' => 'application/x-www-form-urlencoded']) @@ -194,7 +194,7 @@ class PayPalPPCPPaymentDriver extends BaseDriver private function checkPaymentsReceivable(): self { - if($this->company_gateway->getConfigField('status') != 'activated'){ + if($this->company_gateway->getConfigField('status') != 'activated') { if (class_exists(\Modules\Admin\Services\PayPal\PayPalService::class)) { $pp = new \Modules\Admin\Services\PayPal\PayPalService($this->company_gateway->company, $this->company_gateway->user); @@ -203,8 +203,9 @@ class PayPalPPCPPaymentDriver extends BaseDriver $this->company_gateway = $this->company_gateway->fresh(); $config = $this->company_gateway->getConfig(); - if($config->status == 'activated') + if($config->status == 'activated') { return $this; + } } @@ -241,8 +242,9 @@ class PayPalPPCPPaymentDriver extends BaseDriver $r = $this->gatewayRequest('/v1/identity/generate-token', 'post', ['body' => '']); - if($r->successful()) + if($r->successful()) { return $r->json()['client_token']; + } throw new PaymentFailed('Unable to gain client token from Paypal. Check your configuration', 401); @@ -278,8 +280,9 @@ class PayPalPPCPPaymentDriver extends BaseDriver } else { - if(isset($response['headers']) ?? false) + if(isset($response['headers']) ?? false) { unset($response['headers']); + } SystemLogger::dispatch( ['response' => $response], @@ -360,7 +363,7 @@ class PayPalPPCPPaymentDriver extends BaseDriver $invoice = Invoice::withTrashed()->find($this->decodePrimaryKey($_invoice->invoice_id)); - $description = collect($invoice->line_items)->map(function ($item){ + $description = collect($invoice->line_items)->map(function ($item) { return $item->notes; })->implode("\n"); @@ -405,7 +408,7 @@ class PayPalPPCPPaymentDriver extends BaseDriver ]; - if($shipping = $this->getShippingAddress()){ + if($shipping = $this->getShippingAddress()) { $order['purchase_units'][0] = $shipping; } @@ -417,9 +420,9 @@ class PayPalPPCPPaymentDriver extends BaseDriver } - private function getBillingAddress(): array + private function getBillingAddress(): array { - return + return [ "address_line_1" => $this->client->address1, "address_line_2" => $this->client->address2, @@ -432,10 +435,10 @@ class PayPalPPCPPaymentDriver extends BaseDriver private function getShippingAddress(): ?array { - return $this->company_gateway->require_shipping_address ? + return $this->company_gateway->require_shipping_address ? [ "shipping" => [ - "address" => + "address" => [ "address_line_1" => $this->client->shipping_address1, "address_line_2" => $this->client->shipping_address2, @@ -481,4 +484,4 @@ class PayPalPPCPPaymentDriver extends BaseDriver { } -} \ No newline at end of file +} diff --git a/app/Repositories/ExpenseRepository.php b/app/Repositories/ExpenseRepository.php index 307ccdaeecf4..d2fed634748a 100644 --- a/app/Repositories/ExpenseRepository.php +++ b/app/Repositories/ExpenseRepository.php @@ -12,16 +12,16 @@ namespace App\Repositories; -use App\Models\Expense; -use Illuminate\Support\Carbon; use App\Factory\ExpenseFactory; +use App\Jobs\Expense\VendorExpenseNotify; +use App\Libraries\Currency\Conversion\CurrencyApi; +use App\Models\Expense; use App\Models\ExpenseCategory; use App\Utils\Traits\GeneratesCounter; -use Illuminate\Database\QueryException; -use App\Jobs\Expense\VendorExpenseNotify; -use Illuminate\Database\Eloquent\Collection; use Carbon\Exceptions\InvalidFormatException; -use App\Libraries\Currency\Conversion\CurrencyApi; +use Illuminate\Database\Eloquent\Collection; +use Illuminate\Database\QueryException; +use Illuminate\Support\Carbon; /** * ExpenseRepository. @@ -48,8 +48,7 @@ class ExpenseRepository extends BaseRepository if(isset($data['payment_date']) && $data['payment_date'] == $expense->payment_date) { //do nothing - } - elseif(isset($data['payment_date']) && strlen($data['payment_date']) > 1 && $user->company()->notify_vendor_when_paid && ($data['vendor_id'] || $expense->vendor_id)) { + } elseif(isset($data['payment_date']) && strlen($data['payment_date']) > 1 && $user->company()->notify_vendor_when_paid && ($data['vendor_id'] || $expense->vendor_id)) { nlog("ping"); $this->notify_vendor = true; } @@ -62,16 +61,17 @@ class ExpenseRepository extends BaseRepository if (empty($expense->number)) { $expense = $this->findAndSaveNumber($expense); - } - else + } else { $expense->saveQuietly(); + } if (array_key_exists('documents', $data)) { $this->saveDocuments($data['documents'], $expense); } - if($this->notify_vendor) + if($this->notify_vendor) { VendorExpenseNotify::dispatch($expense, $expense->company->db); + } return $expense; } @@ -188,13 +188,13 @@ class ExpenseRepository extends BaseRepository { $ec = ExpenseCategory::withTrashed()->find($category_id); - $expenses->when($ec) - ->each(function ($expense) use($ec){ + $expenses->when($ec) + ->each(function ($expense) use ($ec) { - $expense->category_id = $ec->id; - $expense->save(); + $expense->category_id = $ec->id; + $expense->save(); - }); + }); } } diff --git a/app/Repositories/VendorRepository.php b/app/Repositories/VendorRepository.php index 51a2a5d960df..9f4c20a978fe 100644 --- a/app/Repositories/VendorRepository.php +++ b/app/Repositories/VendorRepository.php @@ -55,7 +55,7 @@ class VendorRepository extends BaseRepository if ($vendor->number == '' || ! $vendor->number) { $vendor->number = $this->getNextVendorNumber($vendor); - } + } $vendor->saveQuietly(); diff --git a/app/Services/Client/ClientService.php b/app/Services/Client/ClientService.php index cdb9b5f5394c..2b7f76335539 100644 --- a/app/Services/Client/ClientService.php +++ b/app/Services/Client/ClientService.php @@ -11,17 +11,16 @@ namespace App\Services\Client; -use Carbon\Carbon; -use App\Utils\Number; use App\Models\Client; use App\Models\Credit; use App\Models\Invoice; use App\Models\Payment; use App\Services\Email\Email; -use App\Utils\Traits\MakesDates; -use Illuminate\Support\Facades\DB; use App\Services\Email\EmailObject; +use App\Utils\Number; +use App\Utils\Traits\MakesDates; use Illuminate\Mail\Mailables\Address; +use Illuminate\Support\Facades\DB; class ClientService { @@ -65,7 +64,7 @@ class ClientService /** * Seeing too many race conditions under heavy load here. - * + * * @param float $amount * @return ClientService */ diff --git a/app/Services/Client/PaymentMethod.php b/app/Services/Client/PaymentMethod.php index 348df82a5904..d343e7fb466c 100644 --- a/app/Services/Client/PaymentMethod.php +++ b/app/Services/Client/PaymentMethod.php @@ -80,25 +80,25 @@ class PaymentMethod return array_search($model->id, $transformed_ids); // this closure sorts for us }); - //2023-10-11 - Roll back, do not show any gateways, if they have been archived upstream. - //removing this logic now to prevent any - // if($this->gateways->count() == 0 && count($transformed_ids) >=1) { + //2023-10-11 - Roll back, do not show any gateways, if they have been archived upstream. + //removing this logic now to prevent any + // if($this->gateways->count() == 0 && count($transformed_ids) >=1) { - // /** - // * This is a fallback in case a user archives some gateways that have been ordered preferentially. - // * - // * If the user archives a parent gateway upstream, it may leave a client setting in a state where no payment gateways are available. - // * - // * In this case we fall back to all gateways. - // */ - // $this->gateways = CompanyGateway::query() - // ->with('gateway') - // ->where('company_id', $this->client->company_id) - // ->where('gateway_key', '!=', '54faab2ab6e3223dbe848b1686490baa') - // ->whereNull('deleted_at') - // ->where('is_deleted', false)->get(); + // /** + // * This is a fallback in case a user archives some gateways that have been ordered preferentially. + // * + // * If the user archives a parent gateway upstream, it may leave a client setting in a state where no payment gateways are available. + // * + // * In this case we fall back to all gateways. + // */ + // $this->gateways = CompanyGateway::query() + // ->with('gateway') + // ->where('company_id', $this->client->company_id) + // ->where('gateway_key', '!=', '54faab2ab6e3223dbe848b1686490baa') + // ->whereNull('deleted_at') + // ->where('is_deleted', false)->get(); - // } + // } } else { $this->gateways = CompanyGateway::query() diff --git a/app/Services/Client/Statement.php b/app/Services/Client/Statement.php index 1721b6f56236..ef591ce4a04e 100644 --- a/app/Services/Client/Statement.php +++ b/app/Services/Client/Statement.php @@ -434,16 +434,15 @@ class Statement ->where('balance', '>', 0) ->where('is_deleted', 0); - if($range == '0'){ - $query->where(function ($q) use($to, $from){ - $q->whereBetween('due_date', [$to, $from])->orWhereNull('due_date'); - }); - } - else { - $query->whereBetween('due_date', [$to, $from]); - } + if($range == '0') { + $query->where(function ($q) use ($to, $from) { + $q->whereBetween('due_date', [$to, $from])->orWhereNull('due_date'); + }); + } else { + $query->whereBetween('due_date', [$to, $from]); + } - $amount = $query->sum('balance'); + $amount = $query->sum('balance'); return Number::formatMoney($amount, $this->client); } diff --git a/app/Services/Company/CompanyService.php b/app/Services/Company/CompanyService.php index 49d8cb5cb7fc..cee1c37d8a93 100644 --- a/app/Services/Company/CompanyService.php +++ b/app/Services/Company/CompanyService.php @@ -11,11 +11,12 @@ namespace App\Services\Company; -use App\Models\User; -use App\Models\Company; use App\Factory\TaxRateFactory; +use App\Models\Company; +use App\Models\User; -class CompanyService{ +class CompanyService +{ public function __construct(public Company $company) { @@ -67,10 +68,10 @@ class CompanyService{ $tax_rate->save(); } - }catch(\Exception $e){ + } catch(\Exception $e) { nlog($e->getMessage()); } } -} \ No newline at end of file +} diff --git a/app/Services/Email/Email.php b/app/Services/Email/Email.php index 7bcc488f50b0..fa7cd008e33a 100644 --- a/app/Services/Email/Email.php +++ b/app/Services/Email/Email.php @@ -273,15 +273,15 @@ class Email implements ShouldQueue $message = $e->getMessage(); - if (stripos($e->getMessage(), 'code 300') || stripos($e->getMessage(), 'code 413')) { - $message = "Either Attachment too large, or recipient has been suppressed."; + if (stripos($e->getMessage(), 'code 300') || stripos($e->getMessage(), 'code 413')) { + $message = "Either Attachment too large, or recipient has been suppressed."; - $this->fail(); - $this->logMailError($e->getMessage(), $this->company->clients()->first()); - $this->cleanUpMailers(); + $this->fail(); + $this->logMailError($e->getMessage(), $this->company->clients()->first()); + $this->cleanUpMailers(); - return; - } + return; + } if (stripos($e->getMessage(), 'code 406')) { diff --git a/app/Services/Email/EmailDefaults.php b/app/Services/Email/EmailDefaults.php index 35413125db18..d643a26686d6 100644 --- a/app/Services/Email/EmailDefaults.php +++ b/app/Services/Email/EmailDefaults.php @@ -293,7 +293,7 @@ class EmailDefaults } /** Purchase Order / Invoice / Credit / Quote PDF */ - if ($this->email->email_object->settings->pdf_email_attachment){ + if ($this->email->email_object->settings->pdf_email_attachment) { $pdf = ((new CreateRawPdf($this->email->email_object->invitation))->handle()); $this->email->email_object->attachments = array_merge($this->email->email_object->attachments, [['file' => base64_encode($pdf), 'name' => $this->email->email_object->entity->numberFormatter().'.pdf']]); } diff --git a/app/Services/Invoice/HandleCancellation.php b/app/Services/Invoice/HandleCancellation.php index 206d1391e0bc..0abd802c8c07 100644 --- a/app/Services/Invoice/HandleCancellation.php +++ b/app/Services/Invoice/HandleCancellation.php @@ -74,7 +74,7 @@ class HandleCancellation extends AbstractService $this->invoice->client->service()->updateBalance($adjustment)->save(); -$this->invoice->client->service()->calculateBalance(); + $this->invoice->client->service()->calculateBalance(); /* Pop the cancellation out of the backup*/ diff --git a/app/Services/Ledger/LedgerService.php b/app/Services/Ledger/LedgerService.php index 2a589191d8b2..a55902ff9cde 100644 --- a/app/Services/Ledger/LedgerService.php +++ b/app/Services/Ledger/LedgerService.php @@ -11,11 +11,10 @@ namespace App\Services\Ledger; -use App\Models\Activity; -use App\Models\CompanyLedger; -use App\Jobs\Ledger\UpdateLedger; use App\Factory\CompanyLedgerFactory; use App\Jobs\Ledger\ClientLedgerBalanceUpdate; +use App\Models\Activity; +use App\Models\CompanyLedger; class LedgerService { @@ -45,8 +44,9 @@ class LedgerService public function updateInvoiceBalance($adjustment, $notes = '') { - if($adjustment == 0) + if($adjustment == 0) { return $this; + } // $timestamp = \Carbon\Carbon::createFromTimestamp($this->entity->updated_at)->format('ymdhhmmssSS'); // $hash = sha1($adjustment.$notes.$this->entity->status_id.$this->entity->client_id.$this->entity->amount.$this->entity->balance.$this->entity->company_id.Activity::UPDATE_INVOICE); diff --git a/app/Services/Payment/RefundPayment.php b/app/Services/Payment/RefundPayment.php index 82e2781e40a6..3d59466a850b 100644 --- a/app/Services/Payment/RefundPayment.php +++ b/app/Services/Payment/RefundPayment.php @@ -149,7 +149,7 @@ class RefundPayment $fields->user_id = $this->payment->user_id; $fields->company_id = $this->payment->company_id; $fields->activity_type_id = Activity::REFUNDED_PAYMENT; - $fields->client_id = $this->payment->client_id; + $fields->client_id = $this->payment->client_id; // $fields->credit_id // TODO $fields->notes = $notes; diff --git a/app/Services/Pdf/PdfConfiguration.php b/app/Services/Pdf/PdfConfiguration.php index a5783fbb4a8c..4dfd3f88acfc 100644 --- a/app/Services/Pdf/PdfConfiguration.php +++ b/app/Services/Pdf/PdfConfiguration.php @@ -330,7 +330,7 @@ class PdfConfiguration } } - /** + /** * Formats a given value based on the clients currency. * * @param float $value The number to be formatted diff --git a/app/Services/Pdf/PdfMock.php b/app/Services/Pdf/PdfMock.php index bc20ee18eaf8..83ff27e40938 100644 --- a/app/Services/Pdf/PdfMock.php +++ b/app/Services/Pdf/PdfMock.php @@ -483,8 +483,8 @@ class PdfMock '_rate3' => '', '$taxes' => '$40.00', '$total' => '$10.00', - '$refund' => '', - '$refunded' => '', + '$refund' => '', + '$refunded' => '', '$phone' => ' ', '$terms' => 'Default company invoice terms', '$from' => 'Bob Jones', diff --git a/app/Services/Pdf/PdfService.php b/app/Services/Pdf/PdfService.php index f879d4d23165..4d516078c391 100644 --- a/app/Services/Pdf/PdfService.php +++ b/app/Services/Pdf/PdfService.php @@ -11,20 +11,20 @@ namespace App\Services\Pdf; -use App\Models\Company; -use App\Models\Invoice; -use App\Utils\HtmlEngine; -use App\Models\QuoteInvitation; -use App\Utils\VendorHtmlEngine; -use App\Models\CreditInvitation; -use App\Utils\PhantomJS\Phantom; -use App\Models\InvoiceInvitation; -use App\Utils\HostedPDF\NinjaPdf; -use App\Utils\Traits\Pdf\PdfMaker; use App\Jobs\Invoice\CreateEInvoice; +use App\Models\Company; +use App\Models\CreditInvitation; +use App\Models\Invoice; +use App\Models\InvoiceInvitation; use App\Models\PurchaseOrderInvitation; -use App\Utils\Traits\Pdf\PageNumbering; +use App\Models\QuoteInvitation; use App\Models\RecurringInvoiceInvitation; +use App\Utils\HostedPDF\NinjaPdf; +use App\Utils\HtmlEngine; +use App\Utils\PhantomJS\Phantom; +use App\Utils\Traits\Pdf\PageNumbering; +use App\Utils\Traits\Pdf\PdfMaker; +use App\Utils\VendorHtmlEngine; use horstoeko\zugferd\ZugferdDocumentPdfBuilder; class PdfService @@ -179,8 +179,9 @@ class PdfService */ private function checkEInvoice(string $pdf): string { - if(!$this->config->entity instanceof Invoice) + if(!$this->config->entity instanceof Invoice) { return $pdf; + } $e_invoice_type = $this->config->settings->e_invoice_type; diff --git a/app/Services/Report/TaxSummaryReport.php b/app/Services/Report/TaxSummaryReport.php index 453e8bcc1a14..08a0a1d95287 100644 --- a/app/Services/Report/TaxSummaryReport.php +++ b/app/Services/Report/TaxSummaryReport.php @@ -85,8 +85,9 @@ class TaxSummaryReport extends BaseExport $this->csv->insertOne([ctrans('texts.tax_summary')]); $this->csv->insertOne([ctrans('texts.created_on'),' ',$this->translateDate(now()->format('Y-m-d'), $this->company->date_format(), $this->company->locale())]); - if($this->input['date_range'] != 'all') + if($this->input['date_range'] != 'all') { $this->csv->insertOne([ctrans('texts.date_range'),' ',$this->translateDate($this->start_date, $this->company->date_format(), $this->company->locale()),' - ',$this->translateDate($this->end_date, $this->company->date_format(), $this->company->locale())]); + } diff --git a/app/Services/Subscription/SubscriptionService.php b/app/Services/Subscription/SubscriptionService.php index e2e331b3f6dd..7c3eb2e88ff9 100644 --- a/app/Services/Subscription/SubscriptionService.php +++ b/app/Services/Subscription/SubscriptionService.php @@ -789,8 +789,8 @@ class SubscriptionService //do nothing } elseif ($last_invoice->balance > 0) { $last_invoice = null; - // $pro_rata_charge_amount = $this->calculateProRataCharge($last_invoice, $old_subscription); - // nlog("pro rata charge = {$pro_rata_charge_amount}"); + // $pro_rata_charge_amount = $this->calculateProRataCharge($last_invoice, $old_subscription); + // nlog("pro rata charge = {$pro_rata_charge_amount}"); } else { $pro_rata_refund_amount = $this->calculateProRataRefund($last_invoice, $old_subscription) * -1; nlog("pro rata refund = {$pro_rata_refund_amount}"); diff --git a/app/Services/Template/TemplateAction.php b/app/Services/Template/TemplateAction.php index e54ee199885f..bf78b3b83948 100644 --- a/app/Services/Template/TemplateAction.php +++ b/app/Services/Template/TemplateAction.php @@ -104,7 +104,7 @@ class TemplateAction implements ShouldQueue ->where('company_id', $this->company->id) ->get(); - // nlog($result->toArray()); + // nlog($result->toArray()); if($result->count() <= 1) { $data[$key] = collect($result); diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index ed0aeb4169e0..4c8134d76e48 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -11,32 +11,32 @@ namespace App\Services\Template; -use App\Models\User; -use App\Models\Quote; -use App\Utils\Number; -use Twig\Error\Error; use App\Models\Client; +use App\Models\Company; use App\Models\Credit; use App\Models\Design; -use App\Models\Vendor; -use App\Models\Company; use App\Models\Invoice; use App\Models\Payment; use App\Models\Project; -use App\Utils\HtmlEngine; -use Twig\Error\LoaderError; -use Twig\Error\SyntaxError; -use Twig\Error\RuntimeError; use App\Models\PurchaseOrder; -use App\Utils\VendorHtmlEngine; -use Twig\Sandbox\SecurityError; +use App\Models\Quote; use App\Models\RecurringInvoice; +use App\Models\User; +use App\Models\Vendor; +use App\Utils\HostedPDF\NinjaPdf; +use App\Utils\HtmlEngine; +use App\Utils\Number; use App\Utils\PaymentHtmlEngine; use App\Utils\Traits\MakesDates; -use App\Utils\HostedPDF\NinjaPdf; use App\Utils\Traits\Pdf\PdfMaker; -use Twig\Extra\Intl\IntlExtension; +use App\Utils\VendorHtmlEngine; use League\CommonMark\CommonMarkConverter; +use Twig\Error\Error; +use Twig\Error\LoaderError; +use Twig\Error\RuntimeError; +use Twig\Error\SyntaxError; +use Twig\Extra\Intl\IntlExtension; +use Twig\Sandbox\SecurityError; class TemplateService { @@ -104,8 +104,9 @@ class TemplateService $filter = new \Twig\TwigFilter('sum', function (?array $array, ?string $column) { - if(!is_array($array)) + if(!is_array($array)) { return 0; + } return array_sum(array_column($array, $column)); }); @@ -161,7 +162,7 @@ class TemplateService } public function addGlobal(array $var): self - { + { $this->global_vars = array_merge($this->global_vars, $var); return $this; @@ -1493,4 +1494,4 @@ class TemplateService return $this; } -} \ No newline at end of file +} diff --git a/app/Services/Vendor/VendorService.php b/app/Services/Vendor/VendorService.php index 100438957feb..f0d2a7f68ac3 100644 --- a/app/Services/Vendor/VendorService.php +++ b/app/Services/Vendor/VendorService.php @@ -18,4 +18,4 @@ class VendorService public function __construct(public Vendor $vendor) { } -} \ No newline at end of file +} diff --git a/config/broadcasting.php b/config/broadcasting.php index b5e1decc60ca..7267bbce6608 100644 --- a/config/broadcasting.php +++ b/config/broadcasting.php @@ -32,9 +32,9 @@ return [ 'pusher' => [ 'driver' => 'pusher', - 'key' => env('PUSHER_APP_KEY',''), - 'secret' => env('PUSHER_APP_SECRET',''), - 'app_id' => env('PUSHER_APP_ID',''), + 'key' => env('PUSHER_APP_KEY', ''), + 'secret' => env('PUSHER_APP_SECRET', ''), + 'app_id' => env('PUSHER_APP_ID', ''), 'options' => [ 'host' => env('PUSHER_HOST', 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com'), 'port' => env('PUSHER_PORT', 443), diff --git a/config/database.php b/config/database.php index ec0694c4110c..32dedf815481 100644 --- a/config/database.php +++ b/config/database.php @@ -237,4 +237,4 @@ return [ * $strategy->disableLoadBalancing(); * return new Predis\Connection\Replication\SentinelReplication($strategy); *}]; - */ \ No newline at end of file + */ diff --git a/config/liap.php b/config/liap.php index 2205309b88f5..4483546d3ffa 100644 --- a/config/liap.php +++ b/config/liap.php @@ -1,19 +1,19 @@ env('REQUIRE_HTTPS', true), 'app_url' => rtrim(env('APP_URL', ''), '/'), 'app_domain' => env('APP_DOMAIN', 'invoicing.co'), - 'app_version' => env('APP_VERSION','5.7.54'), - 'app_tag' => env('APP_TAG','5.7.54'), + 'app_version' => env('APP_VERSION', '5.7.54'), + 'app_tag' => env('APP_TAG', '5.7.54'), 'minimum_client_version' => '5.0.16', 'terms_version' => '1.0.1', 'api_secret' => env('API_SECRET', false), @@ -197,7 +197,7 @@ return [ 'ninja_default_company_gateway_id' => env('NINJA_COMPANY_GATEWAY_ID', null), 'ninja_hosted_secret' => env('NINJA_HOSTED_SECRET', ''), 'ninja_hosted_header' =>env('NINJA_HEADER', ''), - 'ninja_connect_secret' => env('NINJA_CONNECT_SECRET',''), + 'ninja_connect_secret' => env('NINJA_CONNECT_SECRET', ''), 'internal_queue_enabled' => env('INTERNAL_QUEUE_ENABLED', true), 'ninja_apple_api_key' => env('APPLE_API_KEY', false), 'ninja_apple_private_key' => env('APPLE_PRIVATE_KEY', false), @@ -218,7 +218,7 @@ return [ 'dev_mode' => env("YODLEE_DEV_MODE", false), 'config_name' => env("YODLEE_CONFIG_NAME", false), ], - 'licenses' => env('LICENSES',false), + 'licenses' => env('LICENSES', false), 'google_application_credentials' => env("GOOGLE_APPLICATION_CREDENTIALS", false), 'shopify' => [ 'client_id' => env('SHOPIFY_CLIENT_ID', null), diff --git a/database/factories/CompanyFactory.php b/database/factories/CompanyFactory.php index 05ba6aa1b8c9..9d2c61a38504 100644 --- a/database/factories/CompanyFactory.php +++ b/database/factories/CompanyFactory.php @@ -11,9 +11,9 @@ namespace Database\Factories; -use App\Utils\Traits\MakesHash; -use App\DataMapper\Tax\TaxModel; use App\DataMapper\CompanySettings; +use App\DataMapper\Tax\TaxModel; +use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Factories\Factory; class CompanyFactory extends Factory diff --git a/database/factories/InvoiceFactory.php b/database/factories/InvoiceFactory.php index 0724a776b324..713fc07350ad 100644 --- a/database/factories/InvoiceFactory.php +++ b/database/factories/InvoiceFactory.php @@ -37,8 +37,8 @@ class InvoiceFactory extends Factory //'tax_rate3' => 5, 'custom_value1' => $this->faker->date(), 'custom_value2' => rand(0, 1) ? 'yes' : 'no', - 'custom_value3' => $this->faker->numberBetween(1,4), - 'custom_value4' => $this->faker->numberBetween(1,4), + 'custom_value3' => $this->faker->numberBetween(1, 4), + 'custom_value4' => $this->faker->numberBetween(1, 4), 'is_deleted' => false, 'po_number' => $this->faker->text(10), 'date' => $this->faker->date(), diff --git a/database/factories/QuoteFactory.php b/database/factories/QuoteFactory.php index 7b3ea5865afe..67a5ef43f5f9 100644 --- a/database/factories/QuoteFactory.php +++ b/database/factories/QuoteFactory.php @@ -11,8 +11,8 @@ namespace Database\Factories; -use App\Models\Quote; use App\Factory\InvoiceItemFactory; +use App\Models\Quote; use Illuminate\Database\Eloquent\Factories\Factory; class QuoteFactory extends Factory diff --git a/database/migrations/2022_16_12_54687_add_stripe_bacs.php b/database/migrations/2022_16_12_54687_add_stripe_bacs.php index a454e483e29b..61c8677bbdb0 100644 --- a/database/migrations/2022_16_12_54687_add_stripe_bacs.php +++ b/database/migrations/2022_16_12_54687_add_stripe_bacs.php @@ -3,8 +3,6 @@ use App\Models\GatewayType; use App\Models\PaymentType; use Illuminate\Database\Migrations\Migration; -use Illuminate\Database\Schema\Blueprint; -use Illuminate\Support\Facades\Schema; return new class extends Migration { /** @@ -16,8 +14,7 @@ return new class extends Migration { { $pt = PaymentType::find(49); - if(!$pt) - { + if(!$pt) { $type = new PaymentType(); $type->id = 49; $type->name = 'BACS'; @@ -27,8 +24,7 @@ return new class extends Migration { $gt = GatewayType::find(24); - if(!$gt) - { + if(!$gt) { $type = new GatewayType(); $type->id = 24; $type->alias = 'bacs'; diff --git a/database/migrations/2023_02_28_064453_update_designs.php b/database/migrations/2023_02_28_064453_update_designs.php index 6795de26613f..9b6265db822b 100644 --- a/database/migrations/2023_02_28_064453_update_designs.php +++ b/database/migrations/2023_02_28_064453_update_designs.php @@ -1,19 +1,16 @@ cursor()->each(function ($company){ + Company::query()->cursor()->each(function ($company) { $crfs = $company->client_registration_fields; if(!$crfs) { - $crfs = ClientRegistrationFields::generate(); + $crfs = ClientRegistrationFields::generate(); } - foreach($crfs as $key => $crf) - { + foreach($crfs as $key => $crf) { $crfs[$key]['visible'] = $crfs[$key]['required']; } diff --git a/database/migrations/2023_03_09_121033_add_payment_balance_to_clients_table.php b/database/migrations/2023_03_09_121033_add_payment_balance_to_clients_table.php index 9e7809629270..f12b578f24ae 100644 --- a/database/migrations/2023_03_09_121033_add_payment_balance_to_clients_table.php +++ b/database/migrations/2023_03_09_121033_add_payment_balance_to_clients_table.php @@ -1,12 +1,11 @@ settings; - if(!property_exists($settings, 'show_task_item_description')) + if(!property_exists($settings, 'show_task_item_description')) { $company->saveSettings((array)$company->settings, $company); + } }); diff --git a/database/migrations/2023_03_13_156872_add_e_invoice_type_to_clients_table.php b/database/migrations/2023_03_13_156872_add_e_invoice_type_to_clients_table.php index ad5129219784..641218492ace 100644 --- a/database/migrations/2023_03_13_156872_add_e_invoice_type_to_clients_table.php +++ b/database/migrations/2023_03_13_156872_add_e_invoice_type_to_clients_table.php @@ -1,11 +1,10 @@ boolean('tax_data'); }); - Schema::table('products', function (Blueprint $table){ + Schema::table('products', function (Blueprint $table) { $table->unsignedInteger('tax_id')->nullable(); // the product tax constant }); - Schema::table('clients', function (Blueprint $table){ + Schema::table('clients', function (Blueprint $table) { $table->boolean('tax_data'); }); - Schema::table('schedulers', function (Blueprint $table){ + Schema::table('schedulers', function (Blueprint $table) { $table->dropUnique('schedulers_company_id_name_unique'); }); diff --git a/database/migrations/2023_03_24_054758_add_client_is_exempt_from_taxes.php b/database/migrations/2023_03_24_054758_add_client_is_exempt_from_taxes.php index 63996ffd11e8..15b32e5567ba 100644 --- a/database/migrations/2023_03_24_054758_add_client_is_exempt_from_taxes.php +++ b/database/migrations/2023_03_24_054758_add_client_is_exempt_from_taxes.php @@ -1,19 +1,17 @@ unsignedInteger('current_hours')->nullable(); }); - Schema::table('bank_transactions', function(Illuminate\Database\Schema\Blueprint $table) { + Schema::table('bank_transactions', function (Illuminate\Database\Schema\Blueprint $table) { $table->text('expense_id')->default('')->change(); }); @@ -71,7 +69,7 @@ return new class extends Migration }); -//payment types from 34 + //payment types from 34 if(Ninja::isSelfHost()) { diff --git a/database/migrations/2023_04_20_215159_drop_e_invoice_type_column.php b/database/migrations/2023_04_20_215159_drop_e_invoice_type_column.php index ad2adcfd18ea..11c594a4583b 100644 --- a/database/migrations/2023_04_20_215159_drop_e_invoice_type_column.php +++ b/database/migrations/2023_04_20_215159_drop_e_invoice_type_column.php @@ -4,8 +4,7 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration -{ +return new class extends Migration { /** * Run the migrations. * diff --git a/database/migrations/2023_04_27_045639_add_kmher_language.php b/database/migrations/2023_04_27_045639_add_kmher_language.php index 69e7fb433cb3..1aec787e1ccc 100644 --- a/database/migrations/2023_04_27_045639_add_kmher_language.php +++ b/database/migrations/2023_04_27_045639_add_kmher_language.php @@ -1,14 +1,13 @@ 38, 'name' => 'Khmer', 'locale' => 'km_KH']); } - if (Schema::hasColumn('companies', 'enable_e_invoice')) - { + if (Schema::hasColumn('companies', 'enable_e_invoice')) { Schema::table('companies', function (Blueprint $table) { $table->dropColumn('enable_e_invoice'); }); } - Company::query()->cursor()->each(function ($company){ + Company::query()->cursor()->each(function ($company) { $company->tax_data = new TaxModel(); $company->save(); }); diff --git a/database/migrations/2023_05_03_023956_add_shopify_user_id.php b/database/migrations/2023_05_03_023956_add_shopify_user_id.php index 77ef774d233f..a66983baa243 100644 --- a/database/migrations/2023_05_03_023956_add_shopify_user_id.php +++ b/database/migrations/2023_05_03_023956_add_shopify_user_id.php @@ -1,12 +1,10 @@ unsignedBigInteger('shopify_user_id')->index()->nullable(); }); - Schema::table('companies', function(Illuminate\Database\Schema\Blueprint $table){ - $table->string('shopify_name')->index()->nullable(); - $table->string('shopify_access_token')->index()->nullable(); + Schema::table('companies', function (Illuminate\Database\Schema\Blueprint $table) { + $table->string('shopify_name')->index()->nullable(); + $table->string('shopify_access_token')->index()->nullable(); }); } diff --git a/database/migrations/2023_06_04_064713_project_and_task_columns_for_company_model.php b/database/migrations/2023_06_04_064713_project_and_task_columns_for_company_model.php index 4f98a9981b9b..dad3c6cf2e5c 100644 --- a/database/migrations/2023_06_04_064713_project_and_task_columns_for_company_model.php +++ b/database/migrations/2023_06_04_064713_project_and_task_columns_for_company_model.php @@ -1,11 +1,9 @@ clientId = ""; diff --git a/database/migrations/2023_07_06_063512_update_designs.php b/database/migrations/2023_07_06_063512_update_designs.php index d3e7318c64c1..4f887bc2056b 100644 --- a/database/migrations/2023_07_06_063512_update_designs.php +++ b/database/migrations/2023_07_06_063512_update_designs.php @@ -1,11 +1,8 @@ 40, 'name' => 'French - Swiss', 'locale' => 'fr_CH']); - } + if (! $language) { + Language::create(['id' => 40, 'name' => 'French - Swiss', 'locale' => 'fr_CH']); + } } diff --git a/database/migrations/2023_07_12_074829_add_thai_baht_currency_symbol.php b/database/migrations/2023_07_12_074829_add_thai_baht_currency_symbol.php index fe959e037436..3f8ed8e3d9c4 100644 --- a/database/migrations/2023_07_12_074829_add_thai_baht_currency_symbol.php +++ b/database/migrations/2023_07_12_074829_add_thai_baht_currency_symbol.php @@ -2,11 +2,8 @@ use App\Models\Currency; use Illuminate\Database\Migrations\Migration; -use Illuminate\Database\Schema\Blueprint; -use Illuminate\Support\Facades\Schema; -return new class extends Migration -{ +return new class extends Migration { /** * Run the migrations. * diff --git a/database/migrations/2023_07_18_214607_add_start_date_column_to_tasks.php b/database/migrations/2023_07_18_214607_add_start_date_column_to_tasks.php index 74b4a86ae689..8178b4d91540 100644 --- a/database/migrations/2023_07_18_214607_add_start_date_column_to_tasks.php +++ b/database/migrations/2023_07_18_214607_add_start_date_column_to_tasks.php @@ -4,8 +4,7 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration -{ +return new class extends Migration { /** * Run the migrations. * @@ -17,7 +16,7 @@ return new class extends Migration $table->date('calculated_start_date')->nullable(); }); - Schema::table('webhooks', function (Blueprint $table){ + Schema::table('webhooks', function (Blueprint $table) { $table->text('target_url')->change(); }); } diff --git a/database/migrations/2023_07_22_234329_change_currency_format_for_indonesian_rupiah.php b/database/migrations/2023_07_22_234329_change_currency_format_for_indonesian_rupiah.php index 20316a338f63..17ef6578d948 100644 --- a/database/migrations/2023_07_22_234329_change_currency_format_for_indonesian_rupiah.php +++ b/database/migrations/2023_07_22_234329_change_currency_format_for_indonesian_rupiah.php @@ -1,11 +1,8 @@ where('code', 'IDR')->first(); - if($ir){ + if($ir) { $ir->thousand_separator = '.'; $ir->decimal_separator = ','; $ir->save(); diff --git a/database/migrations/2023_08_06_070205_create_view_dashboard_permission_migration.php b/database/migrations/2023_08_06_070205_create_view_dashboard_permission_migration.php index 472f6b92c5f5..9bce8e97b71b 100644 --- a/database/migrations/2023_08_06_070205_create_view_dashboard_permission_migration.php +++ b/database/migrations/2023_08_06_070205_create_view_dashboard_permission_migration.php @@ -1,11 +1,8 @@ clientId = ""; diff --git a/database/migrations/2023_10_18_061415_add_user_notification_suppression.php b/database/migrations/2023_10_18_061415_add_user_notification_suppression.php index 4c01624a02ac..e46eea9f93b6 100644 --- a/database/migrations/2023_10_18_061415_add_user_notification_suppression.php +++ b/database/migrations/2023_10_18_061415_add_user_notification_suppression.php @@ -1,12 +1,11 @@ 'الشركة ', 'name' => 'الاسم', 'website' => 'الموقع الإلكتروني', @@ -5164,8 +5164,6 @@ $LANG = array( 'payment_receipt' => 'إيصال الدفع رقم :number', 'load_template_description' => 'سيتم تطبيق القالب على ما يلي:', 'run_template' => 'تشغيل القالب', -); +]; return $LANG; - -?> diff --git a/lang/bg/texts.php b/lang/bg/texts.php index 9d24d643a31f..661cceef6cbd 100644 --- a/lang/bg/texts.php +++ b/lang/bg/texts.php @@ -1,6 +1,6 @@ 'Организация', 'name' => 'Име', 'website' => 'Уебсайт', @@ -5168,8 +5168,6 @@ $LANG = array( 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/ca/texts.php b/lang/ca/texts.php index e553026fb5d8..d435f1212733 100644 --- a/lang/ca/texts.php +++ b/lang/ca/texts.php @@ -1,6 +1,6 @@ 'Organització', 'name' => 'Nom', 'website' => 'Lloc web', @@ -5167,8 +5167,6 @@ $LANG = array( 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/cs/texts.php b/lang/cs/texts.php index 7423ca953f9b..55ce3e77ec0e 100644 --- a/lang/cs/texts.php +++ b/lang/cs/texts.php @@ -1,6 +1,6 @@ 'Organizace', 'name' => 'Název', 'website' => 'Web', @@ -5189,8 +5189,6 @@ $LANG = array( 'payment_receipt' => 'Payment Receipt # :number', 'load_template_description' => 'The template will be applied to following:', 'run_template' => 'Run template', -); +]; return $LANG; - -?> diff --git a/lang/da/texts.php b/lang/da/texts.php index bd4322e7b186..be84ac59e75a 100644 --- a/lang/da/texts.php +++ b/lang/da/texts.php @@ -1,6 +1,6 @@ 'Organisation', 'name' => 'Navn', 'website' => 'Hjemmeside', @@ -5188,8 +5188,6 @@ $LANG = array( 'payment_receipt' => 'Betaling # :number', 'load_template_description' => 'Skabelonen vil blive anvendt på følgende:', 'run_template' => 'Kør skabelon', -); +]; return $LANG; - -?> diff --git a/lang/de/texts.php b/lang/de/texts.php index ce76b57d2167..72dd18a0e444 100644 --- a/lang/de/texts.php +++ b/lang/de/texts.php @@ -1,6 +1,6 @@ 'Unternehmen', 'name' => 'Name', 'website' => 'Webseite', @@ -5193,8 +5193,6 @@ Leistungsempfängers', 'payment_receipt' => 'Zahlungsbeleg #:number', 'load_template_description' => 'Das Template wird auf Folgendes angewendet:', 'run_template' => 'Template anwenden', -); +]; return $LANG; - -?> diff --git a/lang/el/texts.php b/lang/el/texts.php index f097a8f03974..18e8f6d5fc3f 100644 --- a/lang/el/texts.php +++ b/lang/el/texts.php @@ -1,6 +1,6 @@ 'Οργανισμός', 'name' => 'Επωνυμία', 'website' => 'Ιστοσελίδα', @@ -5167,8 +5167,6 @@ email που είναι συνδεδεμένη με το λογαριασμό σ 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/en/texts.php b/lang/en/texts.php index d1a4d812ad26..719df08a74c9 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -1,6 +1,6 @@ 'Organization', 'name' => 'Name', 'website' => 'Website', @@ -5217,8 +5217,6 @@ $LANG = array( 'vendor_notification_subject' => 'Confirmation of payment :amount sent to :vendor', 'vendor_notification_body' => 'Payment processed for :amount dated :payment_date.
[Transaction Reference: :transaction_reference]', -); +]; return $LANG; - -?> diff --git a/lang/en_GB/texts.php b/lang/en_GB/texts.php index c687b7b8d9cd..5827f8302a98 100644 --- a/lang/en_GB/texts.php +++ b/lang/en_GB/texts.php @@ -1,6 +1,6 @@ 'Organisation', 'name' => 'Name', 'website' => 'Website', @@ -5046,9 +5046,7 @@ $LANG = array( 'oauth_mail' => 'OAuth / Mail', 'preferences' => 'Preferences', 'analytics' => 'Analytics', -); +]; return $LANG; - -?> diff --git a/lang/es/texts.php b/lang/es/texts.php index 449457bc2997..6506bef29699 100644 --- a/lang/es/texts.php +++ b/lang/es/texts.php @@ -1,6 +1,6 @@ 'Empresa', 'name' => 'Nombre', 'website' => 'Sitio Web', @@ -5187,8 +5187,6 @@ $LANG = array( 'payment_receipt' => 'Recibo de pago # :number', 'load_template_description' => 'La plantilla se aplicará a lo siguiente:', 'run_template' => 'Ejecutar plantilla', -); +]; return $LANG; - -?> diff --git a/lang/es_ES/texts.php b/lang/es_ES/texts.php index 8b8904e3f243..87808e044b5f 100644 --- a/lang/es_ES/texts.php +++ b/lang/es_ES/texts.php @@ -1,6 +1,6 @@ 'Organización', 'name' => 'Nombre', 'website' => 'Página Web', @@ -5180,8 +5180,6 @@ De lo contrario, este campo deberá dejarse en blanco.', 'payment_receipt' => 'Recibo de pago Nº :number', 'load_template_description' => 'La plantilla se aplicará a lo siguiente:', 'run_template' => 'Ejecutar plantilla', -); +]; return $LANG; - -?> diff --git a/lang/et/texts.php b/lang/et/texts.php index 371e8532fa72..bcf86c7fc05d 100644 --- a/lang/et/texts.php +++ b/lang/et/texts.php @@ -1,6 +1,6 @@ 'Organisatsioon', 'name' => 'Nimi', 'website' => 'Kodulehekülg', @@ -5163,8 +5163,6 @@ $LANG = array( 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/fa/texts.php b/lang/fa/texts.php index 008aaa2ff484..84785d6a817d 100644 --- a/lang/fa/texts.php +++ b/lang/fa/texts.php @@ -1,6 +1,6 @@ 'شرکت', 'name' => 'نام', 'website' => 'وب سایت', @@ -5167,8 +5167,6 @@ $LANG = array( 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/fi/texts.php b/lang/fi/texts.php index eebbcafc8d18..f87a93252989 100644 --- a/lang/fi/texts.php +++ b/lang/fi/texts.php @@ -1,6 +1,6 @@ 'Yritys', 'name' => 'Nimi', 'website' => 'Kotisivu', @@ -5167,8 +5167,6 @@ Kun saat summat, palaa tälle maksutapasivulle ja klikkaa "Saata loppuun todenta 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/fr/texts.php b/lang/fr/texts.php index 01965074c9df..3a19a150c597 100644 --- a/lang/fr/texts.php +++ b/lang/fr/texts.php @@ -1,6 +1,6 @@ 'Entreprise', 'name' => 'Nom', 'website' => 'Site Web', @@ -5183,8 +5183,6 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'payment_receipt' => 'Reçu de paiement # :number', 'load_template_description' => 'Le modèle sera appliqué aux éléments suivants :', 'run_template' => 'Exécuter le modèle', -); +]; return $LANG; - -?> diff --git a/lang/fr_CA/texts.php b/lang/fr_CA/texts.php index 8730e383b55c..90e13dbd051d 100644 --- a/lang/fr_CA/texts.php +++ b/lang/fr_CA/texts.php @@ -1,6 +1,6 @@ 'Entreprise', 'name' => 'Nom', 'website' => 'Site web', @@ -5205,8 +5205,6 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'payment_email_all_contacts' => 'Courriel de paiement à tous les contacts', 'payment_email_all_contacts_help' => 'Envoi un courriel de paiement à tous les contacts lorsqu\'activé', 'add_line' => 'Ajouter une ligne', -); +]; return $LANG; - -?> diff --git a/lang/fr_CH/texts.php b/lang/fr_CH/texts.php index 94af38da6b9c..a14376496fba 100644 --- a/lang/fr_CH/texts.php +++ b/lang/fr_CH/texts.php @@ -1,6 +1,6 @@ 'Entreprise', 'name' => 'Nom', 'website' => 'Site web', @@ -5205,8 +5205,6 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'payment_email_all_contacts' => 'Email de paiement à tous les contacts', 'payment_email_all_contacts_help' => 'Sends the payment email to all contacts when enabled', 'add_line' => 'Ajouter une ligne', -); +]; return $LANG; - -?> diff --git a/lang/he/texts.php b/lang/he/texts.php index 2aedfb736b05..8c660affe496 100644 --- a/lang/he/texts.php +++ b/lang/he/texts.php @@ -1,6 +1,6 @@ 'ארגון ', 'name' => 'שם', 'website' => 'אתר אינטרנט', @@ -5159,8 +5159,6 @@ $LANG = array( 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/hr/texts.php b/lang/hr/texts.php index 58e7bd4507a8..a2aab7667c3a 100644 --- a/lang/hr/texts.php +++ b/lang/hr/texts.php @@ -1,6 +1,6 @@ 'Organizacija', 'name' => 'Ime', 'website' => 'Web', @@ -5168,8 +5168,6 @@ Nevažeći kontakt email', 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/hu/texts.php b/lang/hu/texts.php index 7dfe109d544e..086cc9cd5b39 100644 --- a/lang/hu/texts.php +++ b/lang/hu/texts.php @@ -1,6 +1,6 @@ 'Szervezet', 'name' => 'Név', 'website' => 'Weboldal', @@ -5145,8 +5145,6 @@ adva :date', 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/it/texts.php b/lang/it/texts.php index fea917dd03c5..7029eeec60e2 100644 --- a/lang/it/texts.php +++ b/lang/it/texts.php @@ -1,6 +1,6 @@ 'Organizzazione', 'name' => 'Nome', 'website' => 'Sito web', @@ -5174,8 +5174,6 @@ $LANG = array( 'payment_receipt' => 'Payment Receipt # :number', 'load_template_description' => 'The template will be applied to following:', 'run_template' => 'Run template', -); +]; return $LANG; - -?> diff --git a/lang/ja/texts.php b/lang/ja/texts.php index 9ba5d559b854..c470d1c749cb 100644 --- a/lang/ja/texts.php +++ b/lang/ja/texts.php @@ -1,6 +1,6 @@ '組織', 'name' => '名前', 'website' => 'WEBサイト', @@ -5167,8 +5167,6 @@ $LANG = array( 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/km_KH/texts.php b/lang/km_KH/texts.php index c7e7486a8448..5e36bea255a6 100644 --- a/lang/km_KH/texts.php +++ b/lang/km_KH/texts.php @@ -1,6 +1,6 @@ 'អង្គការ', 'name' => 'ឈ្មោះ', 'website' => 'គេហទំព័រ', @@ -5141,8 +5141,6 @@ $LANG = array( 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/lt/texts.php b/lang/lt/texts.php index 7ae78811daaa..f19f128bf6ce 100644 --- a/lang/lt/texts.php +++ b/lang/lt/texts.php @@ -1,6 +1,6 @@ 'Įmonė', 'name' => 'Pavadinimas', 'website' => 'Internetinis puslapis', @@ -5158,8 +5158,6 @@ $LANG = array( 'unlinked_transaction' => 'Successfully unlinked transaction', 'view_dashboard_permission' => 'Allow user to access the dashboard, data is limited to available permissions', 'marked_sent_credits' => 'Successfully marked credits sent', -); +]; return $LANG; - -?> diff --git a/lang/lv_LV/texts.php b/lang/lv_LV/texts.php index a64686d823af..0783afaf3c69 100644 --- a/lang/lv_LV/texts.php +++ b/lang/lv_LV/texts.php @@ -1,6 +1,6 @@ 'Uzņēmums', 'name' => 'Nosaukums', 'website' => 'Mājas lapa', @@ -5167,8 +5167,6 @@ $LANG = array( 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/mk_MK/texts.php b/lang/mk_MK/texts.php index 50e294aef385..860a5a22224d 100644 --- a/lang/mk_MK/texts.php +++ b/lang/mk_MK/texts.php @@ -1,6 +1,6 @@ 'Организација', 'name' => 'Име', 'website' => 'Веб Страна', @@ -5168,8 +5168,6 @@ $LANG = array( 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/nb_NO/texts.php b/lang/nb_NO/texts.php index 5084463028ad..5760c702ea98 100644 --- a/lang/nb_NO/texts.php +++ b/lang/nb_NO/texts.php @@ -1,6 +1,6 @@ 'Organisasjon', 'name' => 'Navn', 'website' => 'Nettside', @@ -5158,8 +5158,6 @@ $LANG = array( 'unlinked_transaction' => 'Successfully unlinked transaction', 'view_dashboard_permission' => 'Allow user to access the dashboard, data is limited to available permissions', 'marked_sent_credits' => 'Successfully marked credits sent', -); +]; return $LANG; - -?> diff --git a/lang/nl/texts.php b/lang/nl/texts.php index bbfb547bcca9..4142baba94fb 100644 --- a/lang/nl/texts.php +++ b/lang/nl/texts.php @@ -1,6 +1,6 @@ 'Organisatie', 'name' => 'Bedrijfsnaam', 'website' => 'Website', @@ -5161,8 +5161,6 @@ Email: :email
', 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/pl/texts.php b/lang/pl/texts.php index 151e4aec37ba..5624afc5a1dd 100644 --- a/lang/pl/texts.php +++ b/lang/pl/texts.php @@ -1,6 +1,6 @@ 'Organizacja', 'name' => 'Nazwa', 'website' => 'Strona internetowa', @@ -5165,8 +5165,6 @@ Gdy przelewy zostaną zaksięgowane na Twoim koncie, wróć do tej strony i klik 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/pt_BR/texts.php b/lang/pt_BR/texts.php index 5979a00f3e58..cdb7dcda443c 100644 --- a/lang/pt_BR/texts.php +++ b/lang/pt_BR/texts.php @@ -1,6 +1,6 @@ 'Empresa', 'name' => 'Nome', 'website' => 'Website', @@ -5161,8 +5161,6 @@ Quando tiver as quantias, volte a esta página de formas de pagamento e clique " 'in_stock_quantity' => 'Quantidade em estoque', 'vendor_contact' => 'Contato do fornecedor', -); +]; return $LANG; - -?> diff --git a/lang/pt_PT/texts.php b/lang/pt_PT/texts.php index ce21112cfb52..3e6a454d5a01 100644 --- a/lang/pt_PT/texts.php +++ b/lang/pt_PT/texts.php @@ -1,6 +1,6 @@ 'Organização', 'name' => 'Nome', 'website' => 'Site', @@ -5164,8 +5164,6 @@ O envio de E-mails foi suspenso. Será retomado às 23:00 UTC.', 'in_stock_quantity' => 'Quantidade em estoque', 'vendor_contact' => 'Contato do fornecedor', -); +]; return $LANG; - -?> diff --git a/lang/ro/texts.php b/lang/ro/texts.php index 36d63911627b..805227e6ebb5 100644 --- a/lang/ro/texts.php +++ b/lang/ro/texts.php @@ -1,6 +1,6 @@ 'Organizație', 'name' => 'Nume', 'website' => 'Site web', @@ -5168,8 +5168,6 @@ Odată ce sumele au ajuns la dumneavoastră, reveniți la pagina cu metode de pl 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/ru_RU/texts.php b/lang/ru_RU/texts.php index 83acddde5bd5..ebc38f5b8bbc 100644 --- a/lang/ru_RU/texts.php +++ b/lang/ru_RU/texts.php @@ -1,6 +1,6 @@ 'Организация', 'name' => 'Название', 'website' => 'Веб-сайт', @@ -5159,8 +5159,6 @@ $LANG = array( 'unlinked_transaction' => 'Successfully unlinked transaction', 'view_dashboard_permission' => 'Allow user to access the dashboard, data is limited to available permissions', 'marked_sent_credits' => 'Successfully marked credits sent', -); +]; return $LANG; - -?> diff --git a/lang/sk/texts.php b/lang/sk/texts.php index 4badfa9b3700..9ed740b9bd38 100644 --- a/lang/sk/texts.php +++ b/lang/sk/texts.php @@ -1,6 +1,6 @@ 'Organizácia', 'name' => 'Meno', 'website' => 'Web', @@ -5151,8 +5151,6 @@ Nemôžete nájsť faktúru? Potrebujete poradiť? Radi Vám pomôžeme 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/sl/texts.php b/lang/sl/texts.php index de7bfb8bb0e6..c5678f3c429c 100644 --- a/lang/sl/texts.php +++ b/lang/sl/texts.php @@ -1,6 +1,6 @@ 'Organizacija', 'name' => 'Ime', 'website' => 'Spletna stran', @@ -5167,8 +5167,6 @@ Ko imate zneske, se vrnite na to stran plačilnega sredstva in kliknite na "Comp 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/sq/texts.php b/lang/sq/texts.php index 0909eb662240..2ede1bf28784 100644 --- a/lang/sq/texts.php +++ b/lang/sq/texts.php @@ -1,6 +1,6 @@ 'Organizata', 'name' => 'Emri', 'website' => 'Website', @@ -5165,8 +5165,6 @@ Pasi të keni pranuar shumat, kthehuni në faqen e metodave të pagesës dhe kli 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/sr/texts.php b/lang/sr/texts.php index dc4b91cfcb97..0539598d2796 100644 --- a/lang/sr/texts.php +++ b/lang/sr/texts.php @@ -1,6 +1,6 @@ 'Organizacija', 'name' => 'Ime', 'website' => 'Sajt', @@ -5167,8 +5167,6 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/sv/texts.php b/lang/sv/texts.php index 866d01bb12ea..c354db0b9ecd 100644 --- a/lang/sv/texts.php +++ b/lang/sv/texts.php @@ -1,6 +1,6 @@ 'Organisation', 'name' => 'Namn', 'website' => 'Hemsida', @@ -5174,8 +5174,6 @@ Den här funktionen kräver att en produkt skapas och en betalningsgateway är k 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/th/texts.php b/lang/th/texts.php index ab4a464d3d17..58b2ae0813c4 100644 --- a/lang/th/texts.php +++ b/lang/th/texts.php @@ -1,6 +1,6 @@ 'องค์กร', 'name' => 'ชื่อ', 'website' => 'เว็บไซต์', @@ -5168,8 +5168,6 @@ $LANG = array( 'in_stock_quantity' => 'Stock quantity', 'vendor_contact' => 'Vendor Contact', -); +]; return $LANG; - -?> diff --git a/lang/tr_TR/texts.php b/lang/tr_TR/texts.php index 2a5bccd99801..a729ea0e6333 100644 --- a/lang/tr_TR/texts.php +++ b/lang/tr_TR/texts.php @@ -1,6 +1,6 @@ 'Şirket', 'name' => 'Ünvan', 'website' => 'Web adresi', @@ -5157,8 +5157,6 @@ adresine gönderildi. Müthiş tüm özelliklerin kilidini açmak için lütfen 'unlinked_transaction' => 'Successfully unlinked transaction', 'view_dashboard_permission' => 'Allow user to access the dashboard, data is limited to available permissions', 'marked_sent_credits' => 'Successfully marked credits sent', -); +]; return $LANG; - -?> diff --git a/lang/zh_TW/texts.php b/lang/zh_TW/texts.php index 73ab17b7262f..01ca845c6a23 100644 --- a/lang/zh_TW/texts.php +++ b/lang/zh_TW/texts.php @@ -1,6 +1,6 @@ '組織', 'name' => '姓名', 'website' => '網站', @@ -5186,8 +5186,6 @@ $LANG = array( 'payment_receipt' => '付款收據 # :number', 'load_template_description' => '此模板將應用於以下領域:', 'run_template' => '運行模板', -); +]; return $LANG; - -?> diff --git a/routes/api.php b/routes/api.php index e9a685cbf870..4d648054e298 100644 --- a/routes/api.php +++ b/routes/api.php @@ -10,110 +10,110 @@ | is assigned the "api" middleware group. Enjoy building your API! | */ -use Illuminate\Support\Facades\Route; -use App\Http\Controllers\BaseController; -use App\Http\Controllers\PingController; -use App\Http\Controllers\TaskController; -use App\Http\Controllers\UserController; -use App\Http\Controllers\ChartController; -use App\Http\Controllers\EmailController; -use App\Http\Controllers\QuoteController; -use App\Http\Controllers\TokenController; -use App\Http\Controllers\ClientController; -use App\Http\Controllers\CreditController; -use App\Http\Controllers\DesignController; -use App\Http\Controllers\ExportController; -use App\Http\Controllers\FilterController; -use App\Http\Controllers\ImportController; -use App\Http\Controllers\LogoutController; -use App\Http\Controllers\SearchController; -use App\Http\Controllers\StaticController; -use App\Http\Controllers\StripeController; -use App\Http\Controllers\TwilioController; -use App\Http\Controllers\VendorController; use App\Http\Controllers\AccountController; -use App\Http\Controllers\CompanyController; -use App\Http\Controllers\ExpenseController; -use App\Http\Controllers\InvoiceController; -use App\Http\Controllers\LicenseController; -use App\Http\Controllers\PaymentController; -use App\Http\Controllers\PreviewController; -use App\Http\Controllers\ProductController; -use App\Http\Controllers\ProjectController; -use App\Http\Controllers\TaxRateController; -use App\Http\Controllers\WebCronController; -use App\Http\Controllers\WebhookController; use App\Http\Controllers\ActivityController; -use App\Http\Controllers\DocumentController; -use App\Http\Controllers\PostMarkController; -use App\Http\Controllers\TemplateController; -use App\Http\Controllers\MigrationController; -use App\Http\Controllers\SchedulerController; -use App\Http\Controllers\SubdomainController; -use App\Http\Controllers\SystemLogController; -use App\Http\Controllers\TwoFactorController; +use App\Http\Controllers\Auth\ForgotPasswordController; use App\Http\Controllers\Auth\LoginController; -use App\Http\Controllers\ImportJsonController; -use App\Http\Controllers\SelfUpdateController; -use App\Http\Controllers\TaskStatusController; +use App\Http\Controllers\Auth\PasswordTimeoutController; use App\Http\Controllers\Bank\YodleeController; -use App\Http\Controllers\CompanyUserController; -use App\Http\Controllers\PaymentTermController; -use App\Http\Controllers\EmailHistoryController; -use App\Http\Controllers\GroupSettingController; -use App\Http\Controllers\OneTimeTokenController; -use App\Http\Controllers\SubscriptionController; -use App\Http\Controllers\CompanyLedgerController; -use App\Http\Controllers\PurchaseOrderController; -use App\Http\Controllers\TaskSchedulerController; -use App\Http\Controllers\CompanyGatewayController; -use App\Http\Controllers\PaymentWebhookController; -use App\Http\Controllers\RecurringQuoteController; use App\Http\Controllers\BankIntegrationController; use App\Http\Controllers\BankTransactionController; +use App\Http\Controllers\BankTransactionRuleController; +use App\Http\Controllers\BaseController; +use App\Http\Controllers\ChartController; +use App\Http\Controllers\ClientController; +use App\Http\Controllers\ClientGatewayTokenController; use App\Http\Controllers\ClientStatementController; -use App\Http\Controllers\ExpenseCategoryController; -use App\Http\Controllers\HostedMigrationController; -use App\Http\Controllers\TemplatePreviewController; +use App\Http\Controllers\CompanyController; +use App\Http\Controllers\CompanyGatewayController; +use App\Http\Controllers\CompanyLedgerController; +use App\Http\Controllers\CompanyUserController; use App\Http\Controllers\ConnectedAccountController; +use App\Http\Controllers\CreditController; +use App\Http\Controllers\DesignController; +use App\Http\Controllers\DocumentController; +use App\Http\Controllers\EmailController; +use App\Http\Controllers\EmailHistoryController; +use App\Http\Controllers\ExpenseCategoryController; +use App\Http\Controllers\ExpenseController; +use App\Http\Controllers\ExportController; +use App\Http\Controllers\FilterController; +use App\Http\Controllers\GroupSettingController; +use App\Http\Controllers\HostedMigrationController; +use App\Http\Controllers\ImportController; +use App\Http\Controllers\ImportJsonController; +use App\Http\Controllers\InAppPurchase\AppleController; +use App\Http\Controllers\InvoiceController; +use App\Http\Controllers\LicenseController; +use App\Http\Controllers\LogoutController; +use App\Http\Controllers\MigrationController; +use App\Http\Controllers\OneTimeTokenController; +use App\Http\Controllers\PaymentController; +use App\Http\Controllers\PaymentNotificationWebhookController; +use App\Http\Controllers\PaymentTermController; +use App\Http\Controllers\PaymentWebhookController; +use App\Http\Controllers\PingController; +use App\Http\Controllers\PostMarkController; +use App\Http\Controllers\PreviewController; +use App\Http\Controllers\PreviewPurchaseOrderController; +use App\Http\Controllers\ProductController; +use App\Http\Controllers\ProjectController; +use App\Http\Controllers\ProtectedDownloadController; +use App\Http\Controllers\PurchaseOrderController; +use App\Http\Controllers\QuoteController; use App\Http\Controllers\RecurringExpenseController; use App\Http\Controllers\RecurringInvoiceController; -use App\Http\Controllers\ProtectedDownloadController; -use App\Http\Controllers\ClientGatewayTokenController; -use App\Http\Controllers\Reports\TaskReportController; -use App\Http\Controllers\Auth\ForgotPasswordController; -use App\Http\Controllers\BankTransactionRuleController; -use App\Http\Controllers\InAppPurchase\AppleController; -use App\Http\Controllers\Reports\QuoteReportController; -use App\Http\Controllers\Auth\PasswordTimeoutController; -use App\Http\Controllers\PreviewPurchaseOrderController; +use App\Http\Controllers\RecurringQuoteController; +use App\Http\Controllers\Reports\ActivityReportController; +use App\Http\Controllers\Reports\ARDetailReportController; +use App\Http\Controllers\Reports\ARSummaryReportController; +use App\Http\Controllers\Reports\ClientBalanceReportController; +use App\Http\Controllers\Reports\ClientContactReportController; use App\Http\Controllers\Reports\ClientReportController; +use App\Http\Controllers\Reports\ClientSalesReportController; use App\Http\Controllers\Reports\CreditReportController; -use App\Http\Controllers\Reports\ReportExportController; -use App\Http\Controllers\Reports\VendorReportController; +use App\Http\Controllers\Reports\DocumentReportController; use App\Http\Controllers\Reports\ExpenseReportController; +use App\Http\Controllers\Reports\InvoiceItemReportController; use App\Http\Controllers\Reports\InvoiceReportController; use App\Http\Controllers\Reports\PaymentReportController; use App\Http\Controllers\Reports\ProductReportController; -use App\Http\Controllers\Reports\ProfitAndLossController; -use App\Http\Controllers\Reports\ReportPreviewController; -use App\Http\Controllers\Reports\ActivityReportController; -use App\Http\Controllers\Reports\ARDetailReportController; -use App\Http\Controllers\Reports\DocumentReportController; -use App\Http\Controllers\Reports\ARSummaryReportController; -use App\Http\Controllers\Reports\QuoteItemReportController; -use App\Http\Controllers\Reports\UserSalesReportController; -use App\Http\Controllers\Reports\TaxSummaryReportController; -use App\Http\Controllers\Support\Messages\SendingController; -use App\Http\Controllers\Reports\ClientSalesReportController; -use App\Http\Controllers\Reports\InvoiceItemReportController; -use App\Http\Controllers\PaymentNotificationWebhookController; use App\Http\Controllers\Reports\ProductSalesReportController; -use App\Http\Controllers\Reports\ClientBalanceReportController; -use App\Http\Controllers\Reports\ClientContactReportController; -use App\Http\Controllers\Reports\PurchaseOrderReportController; -use App\Http\Controllers\Reports\RecurringInvoiceReportController; +use App\Http\Controllers\Reports\ProfitAndLossController; use App\Http\Controllers\Reports\PurchaseOrderItemReportController; +use App\Http\Controllers\Reports\PurchaseOrderReportController; +use App\Http\Controllers\Reports\QuoteItemReportController; +use App\Http\Controllers\Reports\QuoteReportController; +use App\Http\Controllers\Reports\RecurringInvoiceReportController; +use App\Http\Controllers\Reports\ReportExportController; +use App\Http\Controllers\Reports\ReportPreviewController; +use App\Http\Controllers\Reports\TaskReportController; +use App\Http\Controllers\Reports\TaxSummaryReportController; +use App\Http\Controllers\Reports\UserSalesReportController; +use App\Http\Controllers\Reports\VendorReportController; +use App\Http\Controllers\SchedulerController; +use App\Http\Controllers\SearchController; +use App\Http\Controllers\SelfUpdateController; +use App\Http\Controllers\StaticController; +use App\Http\Controllers\StripeController; +use App\Http\Controllers\SubdomainController; +use App\Http\Controllers\SubscriptionController; +use App\Http\Controllers\Support\Messages\SendingController; +use App\Http\Controllers\SystemLogController; +use App\Http\Controllers\TaskController; +use App\Http\Controllers\TaskSchedulerController; +use App\Http\Controllers\TaskStatusController; +use App\Http\Controllers\TaxRateController; +use App\Http\Controllers\TemplateController; +use App\Http\Controllers\TemplatePreviewController; +use App\Http\Controllers\TokenController; +use App\Http\Controllers\TwilioController; +use App\Http\Controllers\TwoFactorController; +use App\Http\Controllers\UserController; +use App\Http\Controllers\VendorController; +use App\Http\Controllers\WebCronController; +use App\Http\Controllers\WebhookController; +use Illuminate\Support\Facades\Route; Route::group(['middleware' => ['throttle:api', 'api_secret_check']], function () { Route::post('api/v1/signup', [AccountController::class, 'store'])->name('signup.submit'); @@ -427,4 +427,4 @@ Route::post('api/v1/yodlee/balance', [YodleeController::class, 'balanceWebhook'] Route::get('api/v1/protected_download/{hash}', [ProtectedDownloadController::class, 'index'])->name('protected_download')->middleware('throttle:300,1'); -Route::fallback([BaseController::class, 'notFound'])->middleware('throttle:404'); \ No newline at end of file +Route::fallback([BaseController::class, 'notFound'])->middleware('throttle:404'); diff --git a/routes/client.php b/routes/client.php index 61c0aeb7e6c7..3d8e154912bd 100644 --- a/routes/client.php +++ b/routes/client.php @@ -1,22 +1,21 @@ name('client.catchall')->middleware(['domain_db', 'contact_account','locale', 'throttle:portal']); //catch all diff --git a/routes/console.php b/routes/console.php index 41e4c31bb126..b92aafff798d 100644 --- a/routes/console.php +++ b/routes/console.php @@ -1,6 +1,5 @@ create([ - 'company_id' => $this->company->id, - 'user_id' => $this->user->id, - 'matches_on_all' => false, - 'auto_convert' => true, - 'applies_to' => 'DEBIT', - 'client_id' => $this->client->id, - 'vendor_id' => $this->vendor->id, - 'rules' => [ - [ - 'search_key' => 'description', - 'operator' => 'contains', - 'value' => 'asdddfd', - ] - ] - ]); + public function testMatchingBankTransactionExpenseContainsMiss() + { + $br = BankTransactionRule::factory()->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'matches_on_all' => false, + 'auto_convert' => true, + 'applies_to' => 'DEBIT', + 'client_id' => $this->client->id, + 'vendor_id' => $this->vendor->id, + 'rules' => [ + [ + 'search_key' => 'description', + 'operator' => 'contains', + 'value' => 'asdddfd', + ] + ] + ]); - $bi = BankIntegration::factory()->create([ - 'company_id' => $this->company->id, - 'user_id' => $this->user->id, - 'account_id' => $this->account->id, - ]); + $bi = BankIntegration::factory()->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'account_id' => $this->account->id, + ]); - $bt = BankTransaction::factory()->create([ - 'bank_integration_id' => $bi->id, - 'company_id' => $this->company->id, - 'user_id' => $this->user->id, - 'description' => 'Something asd bizarre', - 'base_type' => 'DEBIT', - 'amount' => 100 - ]); + $bt = BankTransaction::factory()->create([ + 'bank_integration_id' => $bi->id, + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'description' => 'Something asd bizarre', + 'base_type' => 'DEBIT', + 'amount' => 100 + ]); - $bt->service()->processRules(); + $bt->service()->processRules(); - $bt = $bt->fresh(); + $bt = $bt->fresh(); - $this->assertEmpty($bt->expense_id); - } + $this->assertEmpty($bt->expense_id); + } public function testMatchingBankTransactionExpenseContains() diff --git a/tests/Feature/Bank/BankTransactionTest.php b/tests/Feature/Bank/BankTransactionTest.php index e6aff6d22c82..93176928f4df 100644 --- a/tests/Feature/Bank/BankTransactionTest.php +++ b/tests/Feature/Bank/BankTransactionTest.php @@ -12,16 +12,16 @@ namespace Tests\Feature\Bank; -use Tests\TestCase; -use App\Models\Expense; -use App\Models\Invoice; -use Tests\MockAccountData; -use App\Factory\InvoiceFactory; -use App\Models\BankTransaction; -use App\Factory\InvoiceItemFactory; use App\Factory\BankIntegrationFactory; use App\Factory\BankTransactionFactory; +use App\Factory\InvoiceFactory; +use App\Factory\InvoiceItemFactory; +use App\Models\BankTransaction; +use App\Models\Expense; +use App\Models\Invoice; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Tests\MockAccountData; +use Tests\TestCase; class BankTransactionTest extends TestCase { diff --git a/tests/Feature/Bank/YodleeApiTest.php b/tests/Feature/Bank/YodleeApiTest.php index 2cbd504c48bc..1abf733603ec 100644 --- a/tests/Feature/Bank/YodleeApiTest.php +++ b/tests/Feature/Bank/YodleeApiTest.php @@ -156,58 +156,58 @@ class YodleeApiTest extends TestCase $this->assertEquals('Automotive Expenses', $x->highLevelCategoryName); } -// public function testFunctionalMatching() -// { + // public function testFunctionalMatching() + // { -// $yodlee = new Yodlee('sbMem62e1e69547bfb1'); + // $yodlee = new Yodlee('sbMem62e1e69547bfb1'); -// $accounts = $yodlee->getAccounts(); + // $accounts = $yodlee->getAccounts(); -// foreach($accounts as $account) -// { + // foreach($accounts as $account) + // { -// if(!BankIntegration::where('bank_account_id', $account['id'])->where('company_id', $this->company->id)->exists()) -// { -// $bank_integration = new BankIntegration(); -// $bank_integration->company_id = $this->company->id; -// $bank_integration->account_id = $this->company->account_id; -// $bank_integration->user_id = $this->user->id; -// $bank_integration->bank_account_id = $account['id']; -// $bank_integration->bank_account_type = $account['account_type']; -// $bank_integration->bank_account_name = $account['account_name']; -// $bank_integration->bank_account_status = $account['account_status']; -// $bank_integration->bank_account_number = $account['account_number']; -// $bank_integration->provider_id = $account['provider_id']; -// $bank_integration->provider_name = $account['provider_name']; -// $bank_integration->nickname = $account['nickname']; -// $bank_integration->balance = $account['current_balance']; -// $bank_integration->currency = $account['account_currency']; - -// $bank_integration->save(); + // if(!BankIntegration::where('bank_account_id', $account['id'])->where('company_id', $this->company->id)->exists()) + // { + // $bank_integration = new BankIntegration(); + // $bank_integration->company_id = $this->company->id; + // $bank_integration->account_id = $this->company->account_id; + // $bank_integration->user_id = $this->user->id; + // $bank_integration->bank_account_id = $account['id']; + // $bank_integration->bank_account_type = $account['account_type']; + // $bank_integration->bank_account_name = $account['account_name']; + // $bank_integration->bank_account_status = $account['account_status']; + // $bank_integration->bank_account_number = $account['account_number']; + // $bank_integration->provider_id = $account['provider_id']; + // $bank_integration->provider_name = $account['provider_name']; + // $bank_integration->nickname = $account['nickname']; + // $bank_integration->balance = $account['current_balance']; + // $bank_integration->currency = $account['account_currency']; + + // $bank_integration->save(); -// ProcessBankTransactions::dispatchSync('sbMem62e1e69547bfb1', $bank_integration); + // ProcessBankTransactions::dispatchSync('sbMem62e1e69547bfb1', $bank_integration); -// } -// } + // } + // } -// $this->assertGreaterThan(0, BankIntegration::count()); -// $this->assertGreaterThan(0, BankTransaction::count()); + // $this->assertGreaterThan(0, BankIntegration::count()); + // $this->assertGreaterThan(0, BankTransaction::count()); -// $this->invoice->company_id = $this->company->id; -// $this->invoice->number = "XXXXXX8501"; -// $this->invoice->save(); + // $this->invoice->company_id = $this->company->id; + // $this->invoice->number = "XXXXXX8501"; + // $this->invoice->save(); -// BankService::dispatchSync($this->company->id, $this->company->db); - -// $bt = BankTransaction::where('invoice_ids', $this->invoice->hashed_id)->first(); + // BankService::dispatchSync($this->company->id, $this->company->db); + + // $bt = BankTransaction::where('invoice_ids', $this->invoice->hashed_id)->first(); -// nlog(BankTransaction::where('company_id', $this->company->id)->pluck('invoice_ids')); + // nlog(BankTransaction::where('company_id', $this->company->id)->pluck('invoice_ids')); -// $this->assertNotNull($bt); + // $this->assertNotNull($bt); -// $this->assertEquals(BankTransaction::STATUS_MATCHED, $bt->status_id); + // $this->assertEquals(BankTransaction::STATUS_MATCHED, $bt->status_id); -// } + // } public function testDataMatching() @@ -275,179 +275,179 @@ class YodleeApiTest extends TestCase $this->assertNotNull($access_token); } -/** + /** - [transactionCategory] => Array - ( - [0] => stdClass Object - ( - [id] => 1 - [source] => SYSTEM - [classification] => PERSONAL - [category] => Uncategorized - [type] => UNCATEGORIZE - [highLevelCategoryId] => 10000017 - [highLevelCategoryName] => Uncategorized - [defaultCategoryName] => Uncategorized - [defaultHighLevelCategoryName] => Uncategorized - ) + [transactionCategory] => Array + ( + [0] => stdClass Object + ( + [id] => 1 + [source] => SYSTEM + [classification] => PERSONAL + [category] => Uncategorized + [type] => UNCATEGORIZE + [highLevelCategoryId] => 10000017 + [highLevelCategoryName] => Uncategorized + [defaultCategoryName] => Uncategorized + [defaultHighLevelCategoryName] => Uncategorized + ) - [1] => stdClass Object - ( - [id] => 2 - [source] => SYSTEM - [classification] => PERSONAL - [category] => Automotive/Fuel - [type] => EXPENSE - [detailCategory] => Array - ( - [0] => stdClass Object - ( - [id] => 1041 - [name] => Registration/Licensing - ) + [1] => stdClass Object + ( + [id] => 2 + [source] => SYSTEM + [classification] => PERSONAL + [category] => Automotive/Fuel + [type] => EXPENSE + [detailCategory] => Array + ( + [0] => stdClass Object + ( + [id] => 1041 + [name] => Registration/Licensing + ) - [1] => stdClass Object - ( - [id] => 1145 - [name] => Automotive - ) + [1] => stdClass Object + ( + [id] => 1145 + [name] => Automotive + ) - [2] => stdClass Object - ( - [id] => 1218 - [name] => Auto Fees/Penalties - ) + [2] => stdClass Object + ( + [id] => 1218 + [name] => Auto Fees/Penalties + ) - [3] => stdClass Object - ( - [id] => 1260 - [name] => Car Appraisers - ) + [3] => stdClass Object + ( + [id] => 1260 + [name] => Car Appraisers + ) - [4] => stdClass Object - ( - [id] => 1261 - [name] => Car Dealers - ) + [4] => stdClass Object + ( + [id] => 1261 + [name] => Car Dealers + ) - [5] => stdClass Object - ( - [id] => 1262 - [name] => Car Dealers and Leasing - ) + [5] => stdClass Object + ( + [id] => 1262 + [name] => Car Dealers and Leasing + ) - [6] => stdClass Object - ( - [id] => 1263 - [name] => Car Parts and Accessories - ) + [6] => stdClass Object + ( + [id] => 1263 + [name] => Car Parts and Accessories + ) - [7] => stdClass Object - ( - [id] => 1264 - [name] => Car Wash and Detail - ) + [7] => stdClass Object + ( + [id] => 1264 + [name] => Car Wash and Detail + ) - [8] => stdClass Object - ( - [id] => 1265 - [name] => Classic and Antique Car - ) + [8] => stdClass Object + ( + [id] => 1265 + [name] => Classic and Antique Car + ) - [9] => stdClass Object - ( - [id] => 1267 - [name] => Maintenance and Repair - ) + [9] => stdClass Object + ( + [id] => 1267 + [name] => Maintenance and Repair + ) - [10] => stdClass Object - ( - [id] => 1268 - [name] => Motorcycles/Mopeds/Scooters - ) + [10] => stdClass Object + ( + [id] => 1268 + [name] => Motorcycles/Mopeds/Scooters + ) - [11] => stdClass Object - ( - [id] => 1269 - [name] => Oil and Lube - ) + [11] => stdClass Object + ( + [id] => 1269 + [name] => Oil and Lube + ) - [12] => stdClass Object - ( - [id] => 1270 - [name] => Motorcycle Repair - ) + [12] => stdClass Object + ( + [id] => 1270 + [name] => Motorcycle Repair + ) - [13] => stdClass Object - ( - [id] => 1271 - [name] => RVs and Motor Homes - ) + [13] => stdClass Object + ( + [id] => 1271 + [name] => RVs and Motor Homes + ) - [14] => stdClass Object - ( - [id] => 1272 - [name] => Motorcycle Sales - ) + [14] => stdClass Object + ( + [id] => 1272 + [name] => Motorcycle Sales + ) - [15] => stdClass Object - ( - [id] => 1273 - [name] => Salvage Yards - ) + [15] => stdClass Object + ( + [id] => 1273 + [name] => Salvage Yards + ) - [16] => stdClass Object - ( - [id] => 1274 - [name] => Smog Check - ) + [16] => stdClass Object + ( + [id] => 1274 + [name] => Smog Check + ) - [17] => stdClass Object - ( - [id] => 1275 - [name] => Tires - ) + [17] => stdClass Object + ( + [id] => 1275 + [name] => Tires + ) - [18] => stdClass Object - ( - [id] => 1276 - [name] => Towing - ) + [18] => stdClass Object + ( + [id] => 1276 + [name] => Towing + ) - [19] => stdClass Object - ( - [id] => 1277 - [name] => Transmissions - ) + [19] => stdClass Object + ( + [id] => 1277 + [name] => Transmissions + ) - [20] => stdClass Object - ( - [id] => 1278 - [name] => Used Cars - ) + [20] => stdClass Object + ( + [id] => 1278 + [name] => Used Cars + ) - [21] => stdClass Object - ( - [id] => 1240 - [name] => e-Charging - ) + [21] => stdClass Object + ( + [id] => 1240 + [name] => e-Charging + ) - [22] => stdClass Object - ( - [id] => 1266 - [name] => Gas Stations - ) + [22] => stdClass Object + ( + [id] => 1266 + [name] => Gas Stations + ) - ) + ) - [highLevelCategoryId] => 10000003 - [highLevelCategoryName] => Automotive Expenses - [defaultCategoryName] => Automotive Expenses - [defaultHighLevelCategoryName] => Automotive Expenses - ) + [highLevelCategoryId] => 10000003 + [highLevelCategoryName] => Automotive Expenses + [defaultCategoryName] => Automotive Expenses + [defaultHighLevelCategoryName] => Automotive Expenses + ) -*/ + */ public function testGetCategories() @@ -460,107 +460,107 @@ class YodleeApiTest extends TestCase } -/** -[2022-08-05 01:29:45] local.INFO: stdClass Object -( - [account] => Array - ( - [0] => stdClass Object - ( - [CONTAINER] => bank - [providerAccountId] => 11308693 - [accountName] => My CD - 8878 - [accountStatus] => ACTIVE - [accountNumber] => xxxx8878 - [aggregationSource] => USER - [isAsset] => 1 - [balance] => stdClass Object - ( - [currency] => USD - [amount] => 49778.07 - ) + /** + [2022-08-05 01:29:45] local.INFO: stdClass Object + ( + [account] => Array + ( + [0] => stdClass Object + ( + [CONTAINER] => bank + [providerAccountId] => 11308693 + [accountName] => My CD - 8878 + [accountStatus] => ACTIVE + [accountNumber] => xxxx8878 + [aggregationSource] => USER + [isAsset] => 1 + [balance] => stdClass Object + ( + [currency] => USD + [amount] => 49778.07 + ) - [id] => 12331861 - [includeInNetWorth] => 1 - [providerId] => 18769 - [providerName] => Dag Site Captcha - [isManual] => - [currentBalance] => stdClass Object - ( - [currency] => USD - [amount] => 49778.07 - ) + [id] => 12331861 + [includeInNetWorth] => 1 + [providerId] => 18769 + [providerName] => Dag Site Captcha + [isManual] => + [currentBalance] => stdClass Object + ( + [currency] => USD + [amount] => 49778.07 + ) - [accountType] => CD - [displayedName] => LORETTA - [createdDate] => 2022-07-28T06:55:33Z - [lastUpdated] => 2022-07-28T06:56:09Z - [dataset] => Array - ( - [0] => stdClass Object - ( - [name] => BASIC_AGG_DATA - [additionalStatus] => AVAILABLE_DATA_RETRIEVED - [updateEligibility] => ALLOW_UPDATE - [lastUpdated] => 2022-07-28T06:55:50Z - [lastUpdateAttempt] => 2022-07-28T06:55:50Z - ) + [accountType] => CD + [displayedName] => LORETTA + [createdDate] => 2022-07-28T06:55:33Z + [lastUpdated] => 2022-07-28T06:56:09Z + [dataset] => Array + ( + [0] => stdClass Object + ( + [name] => BASIC_AGG_DATA + [additionalStatus] => AVAILABLE_DATA_RETRIEVED + [updateEligibility] => ALLOW_UPDATE + [lastUpdated] => 2022-07-28T06:55:50Z + [lastUpdateAttempt] => 2022-07-28T06:55:50Z + ) - ) + ) - ) - [1] => stdClass Object - ( - [CONTAINER] => bank - [providerAccountId] => 11308693 - [accountName] => Joint Savings - 7159 - [accountStatus] => ACTIVE - [accountNumber] => xxxx7159 - [aggregationSource] => USER - [isAsset] => 1 - [balance] => stdClass Object - ( - [currency] => USD - [amount] => 186277.45 - ) + ) + [1] => stdClass Object + ( + [CONTAINER] => bank + [providerAccountId] => 11308693 + [accountName] => Joint Savings - 7159 + [accountStatus] => ACTIVE + [accountNumber] => xxxx7159 + [aggregationSource] => USER + [isAsset] => 1 + [balance] => stdClass Object + ( + [currency] => USD + [amount] => 186277.45 + ) - [id] => 12331860 - [includeInNetWorth] => 1 - [providerId] => 18769 - [providerName] => Dag Site Captcha - [isManual] => - [availableBalance] => stdClass Object - ( - [currency] => USD - [amount] => 186277.45 - ) + [id] => 12331860 + [includeInNetWorth] => 1 + [providerId] => 18769 + [providerName] => Dag Site Captcha + [isManual] => + [availableBalance] => stdClass Object + ( + [currency] => USD + [amount] => 186277.45 + ) - [currentBalance] => stdClass Object - ( - [currency] => USD - [amount] => 186277.45 - ) + [currentBalance] => stdClass Object + ( + [currency] => USD + [amount] => 186277.45 + ) - [accountType] => SAVINGS - [displayedName] => LYDIA - [createdDate] => 2022-07-28T06:55:33Z - [classification] => PERSONAL - [lastUpdated] => 2022-07-28T06:56:09Z - [dataset] => Array - ( - [0] => stdClass Object - ( - [name] => BASIC_AGG_DATA - [additionalStatus] => AVAILABLE_DATA_RETRIEVED - [updateEligibility] => ALLOW_UPDATE - [lastUpdated] => 2022-07-28T06:55:50Z - [lastUpdateAttempt] => 2022-07-28T06:55:50Z - ) + [accountType] => SAVINGS + [displayedName] => LYDIA + [createdDate] => 2022-07-28T06:55:33Z + [classification] => PERSONAL + [lastUpdated] => 2022-07-28T06:56:09Z + [dataset] => Array + ( + [0] => stdClass Object + ( + [name] => BASIC_AGG_DATA + [additionalStatus] => AVAILABLE_DATA_RETRIEVED + [updateEligibility] => ALLOW_UPDATE + [lastUpdated] => 2022-07-28T06:55:50Z + [lastUpdateAttempt] => 2022-07-28T06:55:50Z + ) - ) + ) - ) -*/ + ) + */ public function testGetAccounts() { $yodlee = new Yodlee('sbMem62e1e69547bfb1'); @@ -571,51 +571,51 @@ class YodleeApiTest extends TestCase } -/** -[2022-08-05 01:36:34] local.INFO: stdClass Object -( - [transaction] => Array - ( - [0] => stdClass Object - ( - [CONTAINER] => bank - [id] => 103953585 - [amount] => stdClass Object - ( - [amount] => 480.66 - [currency] => USD - ) + /** + [2022-08-05 01:36:34] local.INFO: stdClass Object + ( + [transaction] => Array + ( + [0] => stdClass Object + ( + [CONTAINER] => bank + [id] => 103953585 + [amount] => stdClass Object + ( + [amount] => 480.66 + [currency] => USD + ) - [categoryType] => UNCATEGORIZE - [categoryId] => 1 - [category] => Uncategorized - [categorySource] => SYSTEM - [highLevelCategoryId] => 10000017 - [createdDate] => 2022-08-04T21:50:17Z - [lastUpdated] => 2022-08-04T21:50:17Z - [description] => stdClass Object - ( - [original] => CHEROKEE NATION TAX TA TAHLEQUAH OK - ) + [categoryType] => UNCATEGORIZE + [categoryId] => 1 + [category] => Uncategorized + [categorySource] => SYSTEM + [highLevelCategoryId] => 10000017 + [createdDate] => 2022-08-04T21:50:17Z + [lastUpdated] => 2022-08-04T21:50:17Z + [description] => stdClass Object + ( + [original] => CHEROKEE NATION TAX TA TAHLEQUAH OK + ) - [isManual] => - [sourceType] => AGGREGATED - [date] => 2022-08-03 - [transactionDate] => 2022-08-03 - [postDate] => 2022-08-03 - [status] => POSTED - [accountId] => 12331794 - [runningBalance] => stdClass Object - ( - [amount] => 480.66 - [currency] => USD - ) + [isManual] => + [sourceType] => AGGREGATED + [date] => 2022-08-03 + [transactionDate] => 2022-08-03 + [postDate] => 2022-08-03 + [status] => POSTED + [accountId] => 12331794 + [runningBalance] => stdClass Object + ( + [amount] => 480.66 + [currency] => USD + ) - [checkNumber] => 998 - ) + [checkNumber] => 998 + ) - */ + */ public function testGetTransactions() { diff --git a/tests/Feature/BankTransactionApiTest.php b/tests/Feature/BankTransactionApiTest.php index a79cd8e50747..a0a6868ac890 100644 --- a/tests/Feature/BankTransactionApiTest.php +++ b/tests/Feature/BankTransactionApiTest.php @@ -11,15 +11,15 @@ namespace Tests\Feature; -use Tests\TestCase; -use App\Models\Expense; -use Tests\MockAccountData; use App\Models\BankIntegration; use App\Models\BankTransaction; +use App\Models\Expense; use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\Session; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Support\Facades\Session; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test diff --git a/tests/Feature/BankTransactionRuleApiTest.php b/tests/Feature/BankTransactionRuleApiTest.php index 59edbda2e15b..843b6241cbb5 100644 --- a/tests/Feature/BankTransactionRuleApiTest.php +++ b/tests/Feature/BankTransactionRuleApiTest.php @@ -41,24 +41,24 @@ class BankTransactionRuleApiTest extends TestCase Model::reguard(); } -/* -$rules = [ - 'name' => 'bail|required|string', - 'rules' => 'bail|array', - 'auto_convert' => 'bail|sometimes|bool', - 'matches_on_all' => 'bail|sometimes|bool', - 'applies_to' => 'bail|sometimes|bool', -]; + /* + $rules = [ + 'name' => 'bail|required|string', + 'rules' => 'bail|array', + 'auto_convert' => 'bail|sometimes|bool', + 'matches_on_all' => 'bail|sometimes|bool', + 'applies_to' => 'bail|sometimes|bool', + ]; -if(isset($this->category_id)) - $rules['category_id'] = 'bail|sometimes|exists:expense_categories,id,'.auth()->user()->company()->id.',is_deleted,0'; + if(isset($this->category_id)) + $rules['category_id'] = 'bail|sometimes|exists:expense_categories,id,'.auth()->user()->company()->id.',is_deleted,0'; -if(isset($this->vendor_id)) - $rules['vendor_id'] = 'bail|sometimes|exists:vendors,id,company_id,'.auth()->user()->company()->id.',is_deleted,0'; + if(isset($this->vendor_id)) + $rules['vendor_id'] = 'bail|sometimes|exists:vendors,id,company_id,'.auth()->user()->company()->id.',is_deleted,0'; -if(isset($this->client_id)) - $rules['client_id'] = 'bail|sometimes|exists:clients,id,company_id,'.auth()->user()->company()->id.',is_deleted,0'; -*/ + if(isset($this->client_id)) + $rules['client_id'] = 'bail|sometimes|exists:clients,id,company_id,'.auth()->user()->company()->id.',is_deleted,0'; + */ public function testBankRuleCategoryIdValidation() { $data = [ diff --git a/tests/Feature/BaseApiTest.php b/tests/Feature/BaseApiTest.php index 5f2de469f053..bc8e95815ec6 100644 --- a/tests/Feature/BaseApiTest.php +++ b/tests/Feature/BaseApiTest.php @@ -391,9 +391,9 @@ class BaseApiTest extends TestCase // public function testGeneratingClassName() // { - // $this->assertEquals('user', Str::snake(User::class)); + // $this->assertEquals('user', Str::snake(User::class)); - // $this->assertEquals('user',lcfirst(class_basename(Str::snake(User::class)))); + // $this->assertEquals('user',lcfirst(class_basename(Str::snake(User::class)))); // } diff --git a/tests/Feature/ClassificationTest.php b/tests/Feature/ClassificationTest.php index 5a08c8cfca03..9f9544f2219d 100644 --- a/tests/Feature/ClassificationTest.php +++ b/tests/Feature/ClassificationTest.php @@ -11,10 +11,10 @@ namespace Tests\Feature; -use Tests\TestCase; -use Tests\MockUnitData; use App\Utils\Traits\MakesHash; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Tests\MockUnitData; +use Tests\TestCase; /** * @test @@ -217,4 +217,4 @@ class ClassificationTest extends TestCase $this->assertEquals('', $arr['data']['settings']['classification']); } -} \ No newline at end of file +} diff --git a/tests/Feature/ClientPortal/CreditsTest.php b/tests/Feature/ClientPortal/CreditsTest.php index ce401c2986bc..070733967b78 100644 --- a/tests/Feature/ClientPortal/CreditsTest.php +++ b/tests/Feature/ClientPortal/CreditsTest.php @@ -108,7 +108,7 @@ class CreditsTest extends TestCase ->assertSee('testing-number-02') ->assertSee('testing-number-03'); - $user->forceDelete(); + $user->forceDelete(); } public function testShowingCreditsWithNullDueDate() @@ -177,7 +177,7 @@ class CreditsTest extends TestCase ->assertSee('testing-number-02') ->assertSee('testing-number-03'); - $account->delete(); + $account->delete(); } } diff --git a/tests/Feature/ClientTest.php b/tests/Feature/ClientTest.php index 89b49d945c6a..54f1e1054504 100644 --- a/tests/Feature/ClientTest.php +++ b/tests/Feature/ClientTest.php @@ -70,27 +70,27 @@ class ClientTest extends TestCase $data = [ "contacts" => [ [ - "email" => "tenda@gmail.com", - "first_name" => "Tenda", - "is_primary" => True, - "last_name" => "Bavuma", - "password" => null, - "send_email" => True + "email" => "tenda@gmail.com", + "first_name" => "Tenda", + "is_primary" => true, + "last_name" => "Bavuma", + "password" => null, + "send_email" => true ], - ], - "country_id" => "356", - "display_name" => "Tenda Bavuma", - "name" => "Tenda Bavuma", - "shipping_country_id" => "356", + ], + "country_id" => "356", + "display_name" => "Tenda Bavuma", + "name" => "Tenda Bavuma", + "shipping_country_id" => "356", ]; - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->postJson('/api/v1/clients', $data); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/clients', $data); - $response->assertStatus(200); + $response->assertStatus(200); } public function testClientMergeContactDrop() @@ -98,41 +98,41 @@ class ClientTest extends TestCase $c = Client::factory()->create(['user_id' => $this->user->id, 'company_id' => $this->company->id]); - ClientContact::factory()->create([ - 'user_id' => $this->user->id, - 'client_id' => $c->id, - 'company_id' => $this->company->id, - 'is_primary' => 1, - ]); + ClientContact::factory()->create([ + 'user_id' => $this->user->id, + 'client_id' => $c->id, + 'company_id' => $this->company->id, + 'is_primary' => 1, + ]); - ClientContact::factory()->create([ - 'user_id' => $this->user->id, - 'client_id' => $c->id, - 'company_id' => $this->company->id, - ]); + ClientContact::factory()->create([ + 'user_id' => $this->user->id, + 'client_id' => $c->id, + 'company_id' => $this->company->id, + ]); $c1 = Client::factory()->create(['user_id' => $this->user->id, 'company_id' => $this->company->id]); - ClientContact::factory()->create([ - 'user_id' => $this->user->id, - 'client_id' => $c1->id, - 'company_id' => $this->company->id, - 'is_primary' => 1, - ]); + ClientContact::factory()->create([ + 'user_id' => $this->user->id, + 'client_id' => $c1->id, + 'company_id' => $this->company->id, + 'is_primary' => 1, + ]); - ClientContact::factory()->create([ - 'user_id' => $this->user->id, - 'client_id' => $c1->id, - 'company_id' => $this->company->id, - ]); + ClientContact::factory()->create([ + 'user_id' => $this->user->id, + 'client_id' => $c1->id, + 'company_id' => $this->company->id, + ]); - ClientContact::factory()->create([ - 'user_id' => $this->user->id, - 'client_id' => $c1->id, - 'company_id' => $this->company->id, - 'email' => '' - ]); + ClientContact::factory()->create([ + 'user_id' => $this->user->id, + 'client_id' => $c1->id, + 'company_id' => $this->company->id, + 'email' => '' + ]); $this->assertEquals(2, $c->contacts->count()); diff --git a/tests/Feature/CompanySettingsTest.php b/tests/Feature/CompanySettingsTest.php index a95934bec6f0..f2316e60b27b 100644 --- a/tests/Feature/CompanySettingsTest.php +++ b/tests/Feature/CompanySettingsTest.php @@ -10,17 +10,15 @@ */ namespace Tests\Feature; -use Tests\TestCase; -use App\Models\Company; -use App\Models\Activity; -use Tests\MockAccountData; -use App\Utils\Traits\MakesHash; use App\DataMapper\CompanySettings; +use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; +use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Support\Facades\Session; use Illuminate\Validation\ValidationException; -use Illuminate\Foundation\Testing\RefreshDatabase; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test diff --git a/tests/Feature/CompanyTest.php b/tests/Feature/CompanyTest.php index 6204e86ad835..91e412812951 100644 --- a/tests/Feature/CompanyTest.php +++ b/tests/Feature/CompanyTest.php @@ -11,19 +11,19 @@ namespace Tests\Feature; -use Tests\TestCase; -use App\Models\Company; -use App\Models\TaxRate; -use Tests\MockAccountData; -use App\Models\CompanyToken; -use App\Utils\Traits\MakesHash; -use Illuminate\Http\UploadedFile; use App\DataMapper\CompanySettings; -use Illuminate\Support\Facades\Log; -use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\Session; use App\Http\Middleware\PasswordProtection; +use App\Models\Company; +use App\Models\CompanyToken; +use App\Models\TaxRate; +use App\Utils\Traits\MakesHash; +use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Http\UploadedFile; +use Illuminate\Support\Facades\Log; +use Illuminate\Support\Facades\Session; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -86,7 +86,7 @@ class CompanyTest extends TestCase 'X-API-TOKEN' => $this->token, ])->putJson('/api/v1/companies/'.$this->encodePrimaryKey($this->company->id), $company_update); - $response->assertStatus(200); + $response->assertStatus(200); $arr = $response->json(); diff --git a/tests/Feature/CreditTest.php b/tests/Feature/CreditTest.php index dd2fc2800771..cdf9e7b65de9 100644 --- a/tests/Feature/CreditTest.php +++ b/tests/Feature/CreditTest.php @@ -44,7 +44,7 @@ class CreditTest extends TestCase public function testApplicableFilters() { - Credit::where('company_id',$this->company->id)->cursor()->each(function ($c){ $c->forceDelete(); }); + Credit::where('company_id', $this->company->id)->cursor()->each(function ($c) { $c->forceDelete(); }); $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), diff --git a/tests/Feature/DesignApiTest.php b/tests/Feature/DesignApiTest.php index cfa46bfd2b5f..48811d7f7a00 100644 --- a/tests/Feature/DesignApiTest.php +++ b/tests/Feature/DesignApiTest.php @@ -11,19 +11,14 @@ namespace Tests\Feature; -use Tests\TestCase; -use App\Models\Design; -use Tests\MockAccountData; use App\Factory\DesignFactory; +use App\Models\Design; use App\Utils\Traits\MakesHash; -use App\Events\Design\DesignWasCreated; -use App\Events\Design\DesignWasDeleted; -use App\Events\Design\DesignWasUpdated; use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\Session; -use App\Events\Design\DesignWasArchived; -use App\Events\Design\DesignWasRestored; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Support\Facades\Session; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test diff --git a/tests/Feature/DocumentsApiTest.php b/tests/Feature/DocumentsApiTest.php index 6d474df51c45..2c46c6b2effb 100644 --- a/tests/Feature/DocumentsApiTest.php +++ b/tests/Feature/DocumentsApiTest.php @@ -11,13 +11,13 @@ namespace Tests\Feature; -use Tests\TestCase; use App\Models\Document; -use Tests\MockAccountData; use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\Session; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Support\Facades\Session; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test diff --git a/tests/Feature/EInvoice/FacturaeTest.php b/tests/Feature/EInvoice/FacturaeTest.php index 2d4053126341..6909a79fc2a6 100644 --- a/tests/Feature/EInvoice/FacturaeTest.php +++ b/tests/Feature/EInvoice/FacturaeTest.php @@ -11,14 +11,12 @@ namespace Tests\Feature\EInvoice; -use Tests\TestCase; -use Tests\MockAccountData; -use Illuminate\Support\Facades\Storage; use App\Services\Invoice\EInvoice\FacturaEInvoice; -use Illuminate\Routing\Middleware\ThrottleRequests; use Illuminate\Foundation\Testing\DatabaseTransactions; - -use function Amp\Iterator\toArray; +use Illuminate\Routing\Middleware\ThrottleRequests; +use Illuminate\Support\Facades\Storage; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -53,64 +51,64 @@ class FacturaeTest extends TestCase } -// protected function validateInvoiceXML($path, $validateSignature=false) { -// // Prepare file to upload -// if (function_exists('curl_file_create')) { -// $postFile = curl_file_create($path); -// } else { -// $postFile = "@" . realpath($path); -// } + // protected function validateInvoiceXML($path, $validateSignature=false) { + // // Prepare file to upload + // if (function_exists('curl_file_create')) { + // $postFile = curl_file_create($path); + // } else { + // $postFile = "@" . realpath($path); + // } -// // Send upload request -// $ch = curl_init(); -// curl_setopt_array($ch, array( -// CURLOPT_RETURNTRANSFER => true, -// CURLOPT_FOLLOWLOCATION => true, -// CURLOPT_URL => "http://plataforma.firma-e.com/VisualizadorFacturae/index2.jsp", -// CURLOPT_POST => 1, -// CURLOPT_POSTFIELDS => array( -// "referencia" => $postFile, -// "valContable" => "on", -// "valFirma" => $validateSignature ? "on" : "off", -// "aceptarCondiciones" => "on", -// "submit" => "Siguiente" -// ), -// CURLOPT_COOKIEJAR => base_path()."/cookie.txt" -// )); -// $res = curl_exec($ch); -// curl_close($ch); -// unset($ch); + // // Send upload request + // $ch = curl_init(); + // curl_setopt_array($ch, array( + // CURLOPT_RETURNTRANSFER => true, + // CURLOPT_FOLLOWLOCATION => true, + // CURLOPT_URL => "http://plataforma.firma-e.com/VisualizadorFacturae/index2.jsp", + // CURLOPT_POST => 1, + // CURLOPT_POSTFIELDS => array( + // "referencia" => $postFile, + // "valContable" => "on", + // "valFirma" => $validateSignature ? "on" : "off", + // "aceptarCondiciones" => "on", + // "submit" => "Siguiente" + // ), + // CURLOPT_COOKIEJAR => base_path()."/cookie.txt" + // )); + // $res = curl_exec($ch); + // curl_close($ch); + // unset($ch); -// nlog($res); + // nlog($res); -// if (strpos($res, "window.open('facturae.jsp'") === false) { -// $this->expectException(\UnexpectedValueException::class); -// } + // if (strpos($res, "window.open('facturae.jsp'") === false) { + // $this->expectException(\UnexpectedValueException::class); + // } -// // Fetch results -// $ch = curl_init(); -// curl_setopt_array($ch, array( -// CURLOPT_RETURNTRANSFER => true, -// CURLOPT_FOLLOWLOCATION => true, -// CURLOPT_URL => "http://plataforma.firma-e.com/VisualizadorFacturae/facturae.jsp", -// CURLOPT_COOKIEFILE => base_path()."/cookie.txt" -// )); -// $res = curl_exec($ch); -// curl_close($ch); -// unset($ch); + // // Fetch results + // $ch = curl_init(); + // curl_setopt_array($ch, array( + // CURLOPT_RETURNTRANSFER => true, + // CURLOPT_FOLLOWLOCATION => true, + // CURLOPT_URL => "http://plataforma.firma-e.com/VisualizadorFacturae/facturae.jsp", + // CURLOPT_COOKIEFILE => base_path()."/cookie.txt" + // )); + // $res = curl_exec($ch); + // curl_close($ch); + // unset($ch); -// nlog($res); + // nlog($res); -// // Validate results -// $this->assertNotEmpty($res, 'Invalid Validator Response'); -// $this->assertNotEmpty(strpos($res, 'euro_ok.png'), 'Invalid XML Format'); -// if ($validateSignature) { -// $this->assertNotEmpty(strpos($res, '>Nivel de Firma Válido<'), 'Invalid Signature'); -// } -// if (strpos($res, '>Sellos de Tiempo<') !== false) { -// $this->assertNotEmpty(strpos($res, '>XAdES_T<'), 'Invalid Timestamp'); -// } -// } + // // Validate results + // $this->assertNotEmpty($res, 'Invalid Validator Response'); + // $this->assertNotEmpty(strpos($res, 'euro_ok.png'), 'Invalid XML Format'); + // if ($validateSignature) { + // $this->assertNotEmpty(strpos($res, '>Nivel de Firma Válido<'), 'Invalid Signature'); + // } + // if (strpos($res, '>Sellos de Tiempo<') !== false) { + // $this->assertNotEmpty(strpos($res, '>XAdES_T<'), 'Invalid Timestamp'); + // } + // } // private function validateInvoiceXML($path) // { @@ -134,4 +132,4 @@ class FacturaeTest extends TestCase // } -} \ No newline at end of file +} diff --git a/tests/Feature/EInvoice/FatturaPATest.php b/tests/Feature/EInvoice/FatturaPATest.php index 11e1ccdee0bb..dfe243f55823 100644 --- a/tests/Feature/EInvoice/FatturaPATest.php +++ b/tests/Feature/EInvoice/FatturaPATest.php @@ -45,4 +45,4 @@ class FatturaPATest extends TestCase $this->assertnotNull($xml); } -} \ No newline at end of file +} diff --git a/tests/Feature/ExpenseApiTest.php b/tests/Feature/ExpenseApiTest.php index 5a8b8d7b7908..8ffb2ab43d98 100644 --- a/tests/Feature/ExpenseApiTest.php +++ b/tests/Feature/ExpenseApiTest.php @@ -11,16 +11,16 @@ namespace Tests\Feature; -use Tests\TestCase; -use App\Models\Expense; -use Tests\MockAccountData; use App\Models\BankIntegration; use App\Models\BankTransaction; +use App\Models\Expense; use App\Models\ExpenseCategory; use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\Session; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Support\Facades\Session; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test diff --git a/tests/Feature/Export/ArDetailReportTest.php b/tests/Feature/Export/ArDetailReportTest.php index 5b5c599162ac..cfd3ddc6d899 100644 --- a/tests/Feature/Export/ArDetailReportTest.php +++ b/tests/Feature/Export/ArDetailReportTest.php @@ -22,7 +22,6 @@ use App\Services\Report\ARDetailReport; use App\Utils\Traits\AppSetup; use App\Utils\Traits\MakesHash; use Illuminate\Routing\Middleware\ThrottleRequests; -use Tests\MockAccountData; use Tests\TestCase; /** diff --git a/tests/Feature/Export/ArSummaryReportTest.php b/tests/Feature/Export/ArSummaryReportTest.php index dffde40f87a9..874ecc6a6f01 100644 --- a/tests/Feature/Export/ArSummaryReportTest.php +++ b/tests/Feature/Export/ArSummaryReportTest.php @@ -18,7 +18,6 @@ use App\Models\Client; use App\Models\Company; use App\Models\Invoice; use App\Models\User; -use App\Services\Report\ARDetailReport; use App\Services\Report\ARSummaryReport; use App\Utils\Traits\MakesHash; use Illuminate\Routing\Middleware\ThrottleRequests; diff --git a/tests/Feature/Export/ClientBalanceReportTest.php b/tests/Feature/Export/ClientBalanceReportTest.php index 875b9139d56c..9e995147f4f8 100644 --- a/tests/Feature/Export/ClientBalanceReportTest.php +++ b/tests/Feature/Export/ClientBalanceReportTest.php @@ -18,7 +18,6 @@ use App\Models\Client; use App\Models\Company; use App\Models\Invoice; use App\Models\User; -use App\Services\Report\ARSummaryReport; use App\Services\Report\ClientBalanceReport; use App\Utils\Traits\MakesHash; use Illuminate\Routing\Middleware\ThrottleRequests; diff --git a/tests/Feature/Export/ClientSalesReportTest.php b/tests/Feature/Export/ClientSalesReportTest.php index 00aff14dbebd..98820c7bce9d 100644 --- a/tests/Feature/Export/ClientSalesReportTest.php +++ b/tests/Feature/Export/ClientSalesReportTest.php @@ -11,18 +11,17 @@ namespace Tests\Feature\Export; -use Tests\TestCase; -use App\Models\User; -use App\Models\Client; -use App\Models\Account; -use App\Models\Company; -use App\Models\Invoice; -use App\Utils\Traits\MakesHash; use App\DataMapper\CompanySettings; use App\Factory\InvoiceItemFactory; +use App\Models\Account; +use App\Models\Client; +use App\Models\Company; +use App\Models\Invoice; +use App\Models\User; use App\Services\Report\ClientSalesReport; -use App\Services\Report\ClientBalanceReport; +use App\Utils\Traits\MakesHash; use Illuminate\Routing\Middleware\ThrottleRequests; +use Tests\TestCase; /** * @test diff --git a/tests/Feature/Export/ReportApiTest.php b/tests/Feature/Export/ReportApiTest.php index 9a8354b13c8b..9e021bcc8461 100644 --- a/tests/Feature/Export/ReportApiTest.php +++ b/tests/Feature/Export/ReportApiTest.php @@ -11,12 +11,10 @@ namespace Tests\Feature\Export; -use Tests\TestCase; -use Tests\MockAccountData; use App\Utils\Traits\MakesHash; -use Illuminate\Support\Facades\Event; use Illuminate\Routing\Middleware\ThrottleRequests; -use Illuminate\Foundation\Testing\Concerns\InteractsWithExceptionHandling; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -162,4 +160,4 @@ class ReportApiTest extends TestCase } -} \ No newline at end of file +} diff --git a/tests/Feature/Export/ReportCsvGenerationTest.php b/tests/Feature/Export/ReportCsvGenerationTest.php index eb868ea852d1..0168c9fa5455 100644 --- a/tests/Feature/Export/ReportCsvGenerationTest.php +++ b/tests/Feature/Export/ReportCsvGenerationTest.php @@ -11,28 +11,27 @@ namespace Tests\Feature\Export; -use Tests\TestCase; -use App\Models\User; -use App\Models\Client; -use App\Models\Credit; -use League\Csv\Reader; -use App\Models\Account; -use App\Models\Company; -use App\Models\Expense; -use App\Models\Invoice; -use App\Models\CompanyToken; -use App\Models\ClientContact; -use App\Export\CSV\TaskExport; -use App\Utils\Traits\MakesHash; -use App\Export\CSV\VendorExport; +use App\DataMapper\CompanySettings; use App\Export\CSV\PaymentExport; use App\Export\CSV\ProductExport; -use App\DataMapper\CompanySettings; -use App\DataMapper\InvoiceItem; +use App\Export\CSV\TaskExport; +use App\Export\CSV\VendorExport; use App\Factory\CompanyUserFactory; use App\Factory\InvoiceItemFactory; -use Illuminate\Support\Facades\Http; +use App\Models\Account; +use App\Models\Client; +use App\Models\ClientContact; +use App\Models\Company; +use App\Models\CompanyToken; +use App\Models\Credit; +use App\Models\Expense; +use App\Models\Invoice; +use App\Models\User; +use App\Utils\Traits\MakesHash; use Illuminate\Routing\Middleware\ThrottleRequests; +use Illuminate\Support\Facades\Http; +use League\Csv\Reader; +use Tests\TestCase; /** * @test @@ -59,8 +58,9 @@ class ReportCsvGenerationTest extends TestCase $this->buildData(); - if (config('ninja.testvars.travis') !== false) + if (config('ninja.testvars.travis') !== false) { $this->markTestSkipped('Skip test no company gateways installed'); + } } @@ -354,7 +354,7 @@ class ReportCsvGenerationTest extends TestCase $query = Invoice::query(); - $query->where(function ($q) use($products){ + $query->where(function ($q) use ($products) { foreach($products as $product) { $q->orWhereJsonContains('line_items', ['product_key' => $product]); } @@ -364,8 +364,8 @@ class ReportCsvGenerationTest extends TestCase $query = Invoice::query(); - $query->where(function ($q){ - $q->orWhereJsonContains('line_items', ['product_key' => 'bob the builder']); + $query->where(function ($q) { + $q->orWhereJsonContains('line_items', ['product_key' => 'bob the builder']); }); $this->assertEquals(1, $query->count()); @@ -400,46 +400,46 @@ class ReportCsvGenerationTest extends TestCase $q->forceDelete(); - Invoice::factory()->create( - [ - 'company_id' => $this->company->id, - 'user_id' => $this->user->id, - 'client_id' => $this->client->id, - 'line_items' => $line_items - ] - ); + Invoice::factory()->create( + [ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'client_id' => $this->client->id, + 'line_items' => $line_items + ] + ); - $item = InvoiceItemFactory::create(); - $item->product_key = 'bob the builder'; + $item = InvoiceItemFactory::create(); + $item->product_key = 'bob the builder'; - $line_items = []; + $line_items = []; - $line_items[] = $item; + $line_items[] = $item; - $q = Invoice::whereJsonContains('line_items', ['product_key' => 'bob the builder']); + $q = Invoice::whereJsonContains('line_items', ['product_key' => 'bob the builder']); - $this->assertEquals(0, $q->count()); + $this->assertEquals(0, $q->count()); - Invoice::factory()->create( - [ - 'company_id' => $this->company->id, - 'user_id' => $this->user->id, - 'client_id' => $this->client->id, - 'line_items' => $line_items - ] - ); + Invoice::factory()->create( + [ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'client_id' => $this->client->id, + 'line_items' => $line_items + ] + ); - $this->assertEquals(1, $q->count()); + $this->assertEquals(1, $q->count()); - $q = Invoice::whereJsonContains('line_items', ['product_key' => 'Bob the builder']); - $this->assertEquals(0, $q->count()); + $q = Invoice::whereJsonContains('line_items', ['product_key' => 'Bob the builder']); + $this->assertEquals(0, $q->count()); - $q = Invoice::whereJsonContains('line_items', ['product_key' => 'bob']); - $this->assertEquals(0, $q->count()); + $q = Invoice::whereJsonContains('line_items', ['product_key' => 'bob']); + $this->assertEquals(0, $q->count()); - $q->forceDelete(); + $q->forceDelete(); - Invoice::withTrashed()->cursor()->each(function ($i){ $i->forceDelete();}); + Invoice::withTrashed()->cursor()->each(function ($i) { $i->forceDelete();}); } public function testVendorCsvGeneration() @@ -1274,7 +1274,7 @@ class ReportCsvGenerationTest extends TestCase $response->assertStatus(200); $arr = $response->json(); $hash = $arr['message']; - $response = $this->poll($hash); + $response = $this->poll($hash); $csv = $response->body(); $this->assertEquals('bob', $this->getFirstValueByColumn($csv, 'Client Name')); diff --git a/tests/Feature/Export/ReportPreviewTest.php b/tests/Feature/Export/ReportPreviewTest.php index 5d8c77291bb3..3aaffd171931 100644 --- a/tests/Feature/Export/ReportPreviewTest.php +++ b/tests/Feature/Export/ReportPreviewTest.php @@ -11,26 +11,26 @@ namespace Tests\Feature\Export; -use Tests\TestCase; -use App\Models\Client; -use App\Models\Expense; -use App\Models\Document; -use Tests\MockAccountData; -use App\Export\CSV\QuoteExport; -use App\Utils\Traits\MakesHash; +use App\Export\CSV\ActivityExport; use App\Export\CSV\ClientExport; -use App\Export\CSV\CreditExport; use App\Export\CSV\ContactExport; +use App\Export\CSV\CreditExport; +use App\Export\CSV\DocumentExport; use App\Export\CSV\ExpenseExport; use App\Export\CSV\InvoiceExport; use App\Export\CSV\PaymentExport; use App\Export\CSV\ProductExport; -use App\Export\CSV\ActivityExport; -use App\Export\CSV\DocumentExport; -use App\Jobs\Report\PreviewReport; -use Illuminate\Support\Facades\Cache; use App\Export\CSV\PurchaseOrderExport; +use App\Export\CSV\QuoteExport; +use App\Jobs\Report\PreviewReport; +use App\Models\Client; +use App\Models\Document; +use App\Models\Expense; +use App\Utils\Traits\MakesHash; use Illuminate\Routing\Middleware\ThrottleRequests; +use Illuminate\Support\Facades\Cache; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -335,7 +335,7 @@ class ReportPreviewTest extends TestCase $r = Cache::pull('123'); $this->assertNotNull($r); -//nlog($r); + //nlog($r); } public function testDocumentJsonExport() @@ -366,7 +366,7 @@ class ReportPreviewTest extends TestCase $r = Cache::pull('123'); $this->assertNotNull($r); -//nlog($r); + //nlog($r); } public function testClientExportJson() @@ -494,4 +494,4 @@ class ReportPreviewTest extends TestCase } -} \ No newline at end of file +} diff --git a/tests/Feature/Export/TaxSummaryReportTest.php b/tests/Feature/Export/TaxSummaryReportTest.php index e4387f1cca42..c3f94b126b17 100644 --- a/tests/Feature/Export/TaxSummaryReportTest.php +++ b/tests/Feature/Export/TaxSummaryReportTest.php @@ -18,7 +18,6 @@ use App\Models\Client; use App\Models\Company; use App\Models\Invoice; use App\Models\User; -use App\Services\Report\ARDetailReport; use App\Services\Report\TaxSummaryReport; use App\Utils\Traits\MakesHash; use Illuminate\Routing\Middleware\ThrottleRequests; diff --git a/tests/Feature/Export/UserSalesReportTest.php b/tests/Feature/Export/UserSalesReportTest.php index bff92d6a34bb..2be1a220237e 100644 --- a/tests/Feature/Export/UserSalesReportTest.php +++ b/tests/Feature/Export/UserSalesReportTest.php @@ -11,21 +11,19 @@ namespace Tests\Feature\Export; -use Tests\TestCase; -use App\Models\User; -use App\Models\Client; -use App\Models\Account; -use App\Models\Company; -use App\Models\Invoice; -use App\Utils\Traits\AppSetup; -use App\Utils\Traits\MakesHash; use App\DataMapper\CompanySettings; use App\Factory\InvoiceItemFactory; -use Illuminate\Support\Facades\Cache; -use App\Export\CSV\ProductSalesExport; -use Illuminate\Support\Facades\Schema; +use App\Models\Account; +use App\Models\Client; +use App\Models\Company; +use App\Models\Invoice; +use App\Models\User; use App\Services\Report\UserSalesReport; +use App\Utils\Traits\MakesHash; use Illuminate\Routing\Middleware\ThrottleRequests; +use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\Schema; +use Tests\TestCase; /** * @test diff --git a/tests/Feature/GroupSettingTest.php b/tests/Feature/GroupSettingTest.php index 98bad3daa703..fb03abcc2984 100644 --- a/tests/Feature/GroupSettingTest.php +++ b/tests/Feature/GroupSettingTest.php @@ -11,13 +11,12 @@ namespace Tests\Feature; -use Tests\TestCase; -use Tests\MockAccountData; +use App\DataMapper\Settings\SettingsData; use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Session; -use App\DataMapper\Settings\SettingsData; -use Spatie\LaravelData\Support\Wrapping\WrapExecutionType; +use Tests\MockAccountData; +use Tests\TestCase; class GroupSettingTest extends TestCase { @@ -114,7 +113,7 @@ class GroupSettingTest extends TestCase $arr = $response->json(); - $this->assertEquals("", (string)NULL); + $this->assertEquals("", (string)null); $this->assertNotNull($arr['data']['settings']['tax_name1']); } diff --git a/tests/Feature/Import/CSV/TaskImportTest.php b/tests/Feature/Import/CSV/TaskImportTest.php index 4ebfaaa6cc61..4979d636f372 100644 --- a/tests/Feature/Import/CSV/TaskImportTest.php +++ b/tests/Feature/Import/CSV/TaskImportTest.php @@ -11,19 +11,15 @@ namespace Tests\Feature\Import\CSV; -use Tests\TestCase; -use App\Models\Task; -use App\Models\Client; -use App\Models\Vendor; -use App\Models\Invoice; -use App\Utils\TruthSource; -use Tests\MockAccountData; -use Illuminate\Support\Str; use App\Import\Providers\Csv; -use App\Utils\Traits\MakesHash; -use Illuminate\Support\Facades\Cache; use App\Import\Transformer\BaseTransformer; +use App\Models\Task; +use App\Utils\Traits\MakesHash; use Illuminate\Routing\Middleware\ThrottleRequests; +use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Str; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -109,8 +105,7 @@ class TaskImportTest extends TestCase $time_log = json_decode($task->time_log); - foreach($time_log as $log) - { + foreach($time_log as $log) { $this->assertFalse($log[3]); } @@ -165,4 +160,4 @@ class TaskImportTest extends TestCase } -} \ No newline at end of file +} diff --git a/tests/Feature/InvoiceEmailTest.php b/tests/Feature/InvoiceEmailTest.php index 23ba03236086..a41ec3cd812e 100644 --- a/tests/Feature/InvoiceEmailTest.php +++ b/tests/Feature/InvoiceEmailTest.php @@ -11,16 +11,16 @@ namespace Tests\Feature; -use Tests\TestCase; -use App\Models\SystemLog; -use Tests\MockAccountData; use App\Jobs\Entity\EmailEntity; +use App\Models\SystemLog; use App\Utils\Traits\GeneratesCounter; use Illuminate\Database\Eloquent\Model; +use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Support\Facades\Bus; use Illuminate\Support\Facades\Session; use Illuminate\Validation\ValidationException; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -103,7 +103,7 @@ class InvoiceEmailTest extends TestCase ->orderBy('id', 'DESC') ->count(); - $this->assertEquals(1, $count); + $this->assertEquals(1, $count); } public function testEntityEmailHistory() diff --git a/tests/Feature/InvoiceTest.php b/tests/Feature/InvoiceTest.php index a40ef6b25d84..f17351c9749d 100644 --- a/tests/Feature/InvoiceTest.php +++ b/tests/Feature/InvoiceTest.php @@ -11,18 +11,18 @@ namespace Tests\Feature; -use Tests\TestCase; +use App\Helpers\Invoice\InvoiceSum; use App\Models\Client; +use App\Models\ClientContact; use App\Models\Invoice; use App\Models\Project; -use Tests\MockAccountData; -use App\Models\ClientContact; -use App\Utils\Traits\MakesHash; -use App\Helpers\Invoice\InvoiceSum; use App\Repositories\InvoiceRepository; +use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\Session; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Support\Facades\Session; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test diff --git a/tests/Feature/LiveDesignTest.php b/tests/Feature/LiveDesignTest.php index 7dc750f10902..946b796db1aa 100644 --- a/tests/Feature/LiveDesignTest.php +++ b/tests/Feature/LiveDesignTest.php @@ -11,13 +11,13 @@ namespace Tests\Feature; -use Tests\TestCase; use App\Models\Design; -use App\Utils\HtmlEngine; -use Tests\MockAccountData; use App\Models\InvoiceInvitation; -use Illuminate\Routing\Middleware\ThrottleRequests; +use App\Utils\HtmlEngine; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Routing\Middleware\ThrottleRequests; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -62,7 +62,7 @@ class LiveDesignTest extends TestCase $data = $engine->generateLabelsAndValues(); - $this->assertIsArray($data); + $this->assertIsArray($data); nlog($data); } diff --git a/tests/Feature/MultiPaymentDeleteTest.php b/tests/Feature/MultiPaymentDeleteTest.php index 8a13b2ec5f25..72c5e3640ac6 100644 --- a/tests/Feature/MultiPaymentDeleteTest.php +++ b/tests/Feature/MultiPaymentDeleteTest.php @@ -129,7 +129,7 @@ class MultiPaymentDeleteTest extends TestCase $this->assertEquals(325, $invoice->client->balance); //payment 163 -// + // $data = [ 'amount' => 163.0, 'client_id' => $this->encodePrimaryKey($client->id), @@ -300,7 +300,7 @@ class MultiPaymentDeleteTest extends TestCase $this->assertEquals(325, $invoice->client->fresh()->paid_to_date); // delete payment 3 -// + // // $data = [ diff --git a/tests/Feature/Ninja/PlanTest.php b/tests/Feature/Ninja/PlanTest.php index 12e27a6a8e01..a468152c6466 100644 --- a/tests/Feature/Ninja/PlanTest.php +++ b/tests/Feature/Ninja/PlanTest.php @@ -11,18 +11,17 @@ namespace Tests\Feature\Ninja; -use Carbon\Carbon; -use Tests\TestCase; +use App\Factory\SubscriptionFactory; use App\Models\Account; use App\Models\License; -use Tests\MockAccountData; -use App\Utils\Traits\MakesHash; use App\Models\RecurringInvoice; -use App\Factory\SubscriptionFactory; -use Illuminate\Support\Facades\Http; +use App\Utils\Traits\MakesHash; +use Carbon\Carbon; use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\Session; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Support\Facades\Session; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test diff --git a/tests/Feature/PaymentTest.php b/tests/Feature/PaymentTest.php index c51af9b87ad5..cba90ac705d5 100644 --- a/tests/Feature/PaymentTest.php +++ b/tests/Feature/PaymentTest.php @@ -355,16 +355,16 @@ class PaymentTest extends TestCase ]; - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->postJson('/api/v1/payments/', $data); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/payments/', $data); // } catch (ValidationException $e) { // $message = json_decode($e->validator->getMessageBag(), 1); $response->assertStatus(422); - // $this->assertTrue(array_key_exists('client_id', $message)); + // $this->assertTrue(array_key_exists('client_id', $message)); // } } @@ -409,13 +409,13 @@ class PaymentTest extends TestCase $response = null; // try { - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->postJson('/api/v1/payments?include=invoices,paymentables', $data); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/payments?include=invoices,paymentables', $data); // } catch (ValidationException $e) { - // $message = json_decode($e->validator->getMessageBag(), 1); - // $this->assertNotNull($message); + // $message = json_decode($e->validator->getMessageBag(), 1); + // $this->assertNotNull($message); // } @@ -471,17 +471,17 @@ class PaymentTest extends TestCase $response = false; // try { - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->postJson('/api/v1/payments?include=invoices', $data); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/payments?include=invoices', $data); // } catch (ValidationException $e) { - // $message = json_decode($e->validator->getMessageBag(), 1); - // $this->assertNotNull($message); + // $message = json_decode($e->validator->getMessageBag(), 1); + // $this->assertNotNull($message); // } // if ($response) { - $response->assertStatus(200); + $response->assertStatus(200); // } } @@ -603,12 +603,12 @@ class PaymentTest extends TestCase $response = false; // try { - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->postJson('/api/v1/payments?include=invoices', $data); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/payments?include=invoices', $data); // } catch (ValidationException $e) { - // $message = json_decode($e->validator->getMessageBag(), 1); + // $message = json_decode($e->validator->getMessageBag(), 1); // } $arr = $response->json(); @@ -755,15 +755,15 @@ class PaymentTest extends TestCase ]; // try { - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->postJson('/api/v1/payments?include=invoices', $data); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/payments?include=invoices', $data); // } catch (ValidationException $e) { - // $message = json_decode($e->validator->getMessageBag(), 1); - $response->assertStatus(422); + // $message = json_decode($e->validator->getMessageBag(), 1); + $response->assertStatus(422); - // $this->assertTrue(array_key_exists('amount', $message)); + // $this->assertTrue(array_key_exists('amount', $message)); // } } @@ -810,26 +810,26 @@ class PaymentTest extends TestCase $response = false; // try { - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->postJson('/api/v1/payments?include=invoices', $data); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/payments?include=invoices', $data); // } catch (ValidationException $e) { - // $message = json_decode($e->validator->getMessageBag(), 1); + // $message = json_decode($e->validator->getMessageBag(), 1); - // $this->assertTrue(array_key_exists('amount', $message)); + // $this->assertTrue(array_key_exists('amount', $message)); // } // if ($response) { - $response->assertStatus(200); + $response->assertStatus(200); - $invoice = Invoice::find($this->decodePrimaryKey($invoice->hashed_id)); + $invoice = Invoice::find($this->decodePrimaryKey($invoice->hashed_id)); - $this->assertEquals($invoice->balance, 8); + $this->assertEquals($invoice->balance, 8); - $payment = $invoice->payments()->first(); + $payment = $invoice->payments()->first(); - $this->assertEquals($payment->applied, 2); + $this->assertEquals($payment->applied, 2); // } } @@ -877,18 +877,18 @@ class PaymentTest extends TestCase $response = false; // try { - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->putJson('/api/v1/payments/'.$this->encodePrimaryKey($payment->id), $data); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->putJson('/api/v1/payments/'.$this->encodePrimaryKey($payment->id), $data); // } catch (ValidationException $e) { - // $message = json_decode($e->validator->getMessageBag(), 1); + // $message = json_decode($e->validator->getMessageBag(), 1); - // $this->assertTrue(array_key_exists('invoices', $message)); + // $this->assertTrue(array_key_exists('invoices', $message)); // }/ // if ($response) { - $response->assertStatus(200); + $response->assertStatus(200); // } } @@ -941,19 +941,19 @@ class PaymentTest extends TestCase $response = false; // try { - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->putJson('/api/v1/payments/'.$this->encodePrimaryKey($payment->id), $data); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->putJson('/api/v1/payments/'.$this->encodePrimaryKey($payment->id), $data); // } catch (ValidationException $e) { - // $message = json_decode($e->validator->getMessageBag(), 1); - // \Log::error(print_r($e->validator->getMessageBag(), 1)); + // $message = json_decode($e->validator->getMessageBag(), 1); + // \Log::error(print_r($e->validator->getMessageBag(), 1)); - // $this->assertTrue(array_key_exists('invoices', $message)); + // $this->assertTrue(array_key_exists('invoices', $message)); // } // if ($response) { - $response->assertStatus(422); + $response->assertStatus(422); // } } @@ -1000,13 +1000,13 @@ class PaymentTest extends TestCase $response = false; // try { - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->postJson('/api/v1/payments/', $data); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/payments/', $data); // } catch (ValidationException $e) { - // $message = json_decode($e->validator->getMessageBag(), 1); - // \Log::error(print_r($e->validator->getMessageBag(), 1)); + // $message = json_decode($e->validator->getMessageBag(), 1); + // \Log::error(print_r($e->validator->getMessageBag(), 1)); // } $response->assertStatus(200); @@ -1435,7 +1435,7 @@ class PaymentTest extends TestCase $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, - ])->postJson('/api/v1/payments?include=invoices', $data); + ])->postJson('/api/v1/payments?include=invoices', $data); $arr = $response->json(); $response->assertStatus(200); diff --git a/tests/Feature/PaymentV2Test.php b/tests/Feature/PaymentV2Test.php index 22a5b83919e5..399246b06080 100644 --- a/tests/Feature/PaymentV2Test.php +++ b/tests/Feature/PaymentV2Test.php @@ -11,20 +11,20 @@ namespace Tests\Feature; -use Tests\TestCase; +use App\Factory\InvoiceItemFactory; use App\Models\Client; +use App\Models\ClientContact; use App\Models\Credit; use App\Models\Invoice; use App\Models\Payment; -use Tests\MockAccountData; -use App\Models\ClientContact; use App\Utils\Traits\MakesHash; -use App\Factory\InvoiceItemFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Routing\Middleware\ThrottleRequests; use Illuminate\Support\Facades\Session; use Illuminate\Validation\ValidationException; -use Illuminate\Routing\Middleware\ThrottleRequests; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -59,7 +59,7 @@ class PaymentV2Test extends TestCase public function testUsingDraftCreditsForPayments() { - $invoice = Invoice::factory()->create([ + $invoice = Invoice::factory()->create([ 'company_id' => $this->company->id, 'user_id' => $this->user->id, 'client_id' => $this->client->id, @@ -111,10 +111,10 @@ class PaymentV2Test extends TestCase $response = null; - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->postJson('/api/v1/payments?include=invoices', $data); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/payments?include=invoices', $data); $arr = $response->json(); $response->assertStatus(200); @@ -261,7 +261,7 @@ class PaymentV2Test extends TestCase } -public function testStorePaymentWithCreditsThenDeletingInvoicesAndThenPayments() + public function testStorePaymentWithCreditsThenDeletingInvoicesAndThenPayments() { $client = Client::factory()->create(['company_id' =>$this->company->id, 'user_id' => $this->user->id, 'balance' => 100, 'paid_to_date' => 0]); ClientContact::factory()->create([ @@ -428,4 +428,4 @@ public function testStorePaymentWithCreditsThenDeletingInvoicesAndThenPayments() } -} \ No newline at end of file +} diff --git a/tests/Feature/Payments/DeletePaymentTest.php b/tests/Feature/Payments/DeletePaymentTest.php index 59cc6ae490fe..6d87757d4464 100644 --- a/tests/Feature/Payments/DeletePaymentTest.php +++ b/tests/Feature/Payments/DeletePaymentTest.php @@ -11,18 +11,12 @@ namespace Tests\Feature\Payments; -use App\Factory\InvoiceFactory; -use App\Helpers\Invoice\InvoiceSum; -use App\Models\Client; -use App\Models\Credit; use App\Models\Invoice; -use App\Models\Payment; use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Routing\Middleware\ThrottleRequests; use Illuminate\Support\Facades\Session; -use Illuminate\Validation\ValidationException; use Tests\MockUnitData; use Tests\TestCase; @@ -58,8 +52,8 @@ class DeletePaymentTest extends TestCase Invoice::factory() ->count(10) ->create([ - 'user_id' => $this->user->id, - 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'company_id' => $this->company->id, 'client_id' => $this->client->id, 'amount' => 101, 'balance' => 101, @@ -69,7 +63,7 @@ class DeletePaymentTest extends TestCase $i = Invoice::where('amount', 101)->where('status_id', 2)->take(1)->get(); - $invoices = $i->map(function ($i){ + $invoices = $i->map(function ($i) { return [ 'invoice_id' => $i->hashed_id, 'amount' => $i->amount, @@ -111,4 +105,4 @@ class DeletePaymentTest extends TestCase }); } -} \ No newline at end of file +} diff --git a/tests/Feature/ProductTest.php b/tests/Feature/ProductTest.php index bc41769e644c..7a709e398d33 100644 --- a/tests/Feature/ProductTest.php +++ b/tests/Feature/ProductTest.php @@ -73,8 +73,7 @@ class ProductTest extends TestCase 'X-API-TOKEN' => $this->token, ])->post('/api/v1/products/bulk', $update) ->assertStatus(200); - } - catch(\Exception $e){ + } catch(\Exception $e) { } diff --git a/tests/Feature/PurchaseOrderTest.php b/tests/Feature/PurchaseOrderTest.php index 4a5dfe798499..b855933fdae3 100644 --- a/tests/Feature/PurchaseOrderTest.php +++ b/tests/Feature/PurchaseOrderTest.php @@ -11,20 +11,19 @@ namespace Tests\Feature; -use Tests\TestCase; -use App\Utils\Ninja; -use App\Models\Activity; -use Tests\MockAccountData; -use Illuminate\Support\Str; -use App\Models\PurchaseOrder; -use App\Utils\Traits\MakesHash; -use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\Session; -use App\Repositories\ActivityRepository; use App\Events\PurchaseOrder\PurchaseOrderWasCreated; use App\Events\PurchaseOrder\PurchaseOrderWasUpdated; -use App\Events\PurchaseOrder\PurchaseOrderWasAccepted; +use App\Models\Activity; +use App\Models\PurchaseOrder; +use App\Repositories\ActivityRepository; +use App\Utils\Ninja; +use App\Utils\Traits\MakesHash; +use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Support\Facades\Session; +use Illuminate\Support\Str; +use Tests\MockAccountData; +use Tests\TestCase; class PurchaseOrderTest extends TestCase { diff --git a/tests/Feature/QuoteTest.php b/tests/Feature/QuoteTest.php index 35605558207c..2b0f4e70266d 100644 --- a/tests/Feature/QuoteTest.php +++ b/tests/Feature/QuoteTest.php @@ -11,19 +11,19 @@ namespace Tests\Feature; -use Tests\TestCase; -use App\Models\Quote; -use App\Models\Client; -use App\Models\Project; -use Tests\MockAccountData; -use App\Models\ClientContact; -use App\Utils\Traits\MakesHash; use App\DataMapper\ClientSettings; use App\Exceptions\QuoteConversion; +use App\Models\Client; +use App\Models\ClientContact; +use App\Models\Project; +use App\Models\Quote; +use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\Session; -use Illuminate\Routing\Middleware\ThrottleRequests; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Routing\Middleware\ThrottleRequests; +use Illuminate\Support\Facades\Session; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test diff --git a/tests/Feature/RecurringExpenseApiTest.php b/tests/Feature/RecurringExpenseApiTest.php index 3c863c047e18..6a302c3b49fa 100644 --- a/tests/Feature/RecurringExpenseApiTest.php +++ b/tests/Feature/RecurringExpenseApiTest.php @@ -11,16 +11,16 @@ namespace Tests\Feature; -use Tests\TestCase; -use Tests\MockAccountData; -use Illuminate\Support\Str; -use App\Utils\Traits\MakesHash; -use App\Models\RecurringInvoice; -use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\Session; use App\Jobs\Cron\RecurringExpensesCron; -use Illuminate\Validation\ValidationException; +use App\Models\RecurringInvoice; +use App\Utils\Traits\MakesHash; +use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Support\Facades\Session; +use Illuminate\Support\Str; +use Illuminate\Validation\ValidationException; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -47,7 +47,7 @@ class RecurringExpenseApiTest extends TestCase Model::reguard(); } - public function testRecurringExpenseGenerationWithCurrencyConversion() + public function testRecurringExpenseGenerationWithCurrencyConversion() { $r = \App\Models\RecurringExpense::factory()->create([ 'user_id' => $this->user->id, @@ -67,7 +67,7 @@ class RecurringExpenseApiTest extends TestCase (new RecurringExpensesCron())->handle(); - $expense = \App\Models\Expense::where('recurring_expense_id', $r->id)->orderBy('id','desc')->first(); + $expense = \App\Models\Expense::where('recurring_expense_id', $r->id)->orderBy('id', 'desc')->first(); $this->assertEquals($r->amount, $expense->amount); $this->assertEquals($r->currency_id, $expense->currency_id); @@ -76,7 +76,7 @@ class RecurringExpenseApiTest extends TestCase } - public function testRecurringExpenseGenerationNullForeignCurrency() + public function testRecurringExpenseGenerationNullForeignCurrency() { $r = \App\Models\RecurringExpense::factory()->create([ 'user_id' => $this->user->id, @@ -95,7 +95,7 @@ class RecurringExpenseApiTest extends TestCase (new RecurringExpensesCron())->handle(); - $expense = \App\Models\Expense::where('recurring_expense_id', $r->id)->orderBy('id','desc')->first(); + $expense = \App\Models\Expense::where('recurring_expense_id', $r->id)->orderBy('id', 'desc')->first(); $this->assertEquals($r->amount, $expense->amount); $this->assertEquals($r->currency_id, $expense->currency_id); @@ -103,7 +103,7 @@ class RecurringExpenseApiTest extends TestCase } - public function testRecurringExpenseGeneration() + public function testRecurringExpenseGeneration() { $r = \App\Models\RecurringExpense::factory()->create([ 'user_id' => $this->user->id, @@ -121,7 +121,7 @@ class RecurringExpenseApiTest extends TestCase (new RecurringExpensesCron())->handle(); - $expense = \App\Models\Expense::where('recurring_expense_id', $r->id)->orderBy('id','desc')->first(); + $expense = \App\Models\Expense::where('recurring_expense_id', $r->id)->orderBy('id', 'desc')->first(); $this->assertEquals($r->amount, $expense->amount); $this->assertEquals($r->currency_id, $expense->currency_id); diff --git a/tests/Feature/RecurringInvoiceTest.php b/tests/Feature/RecurringInvoiceTest.php index b70b2f22ee9a..8f2c3e5e7fa9 100644 --- a/tests/Feature/RecurringInvoiceTest.php +++ b/tests/Feature/RecurringInvoiceTest.php @@ -18,10 +18,10 @@ use App\Factory\RecurringInvoiceToInvoiceFactory; use App\Jobs\RecurringInvoice\UpdateRecurring; use App\Models\Client; use App\Models\ClientContact; +use App\Models\Product; use App\Models\RecurringInvoice; use App\Utils\Helpers; use App\Utils\Traits\MakesHash; -use App\Models\Product; use Carbon\Carbon; use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Testing\DatabaseTransactions; @@ -275,12 +275,12 @@ class RecurringInvoiceTest extends TestCase 'product_key' => 'pink', ]); - $p2 = Product::factory()->create([ - 'company_id' => $this->company->id, - 'user_id' => $this->user->id, - 'cost' => 20, - 'price' => 20, - 'product_key' => 'floyd', + $p2 = Product::factory()->create([ + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + 'cost' => 20, + 'price' => 20, + 'product_key' => 'floyd', ]); $recurring_invoice = RecurringInvoiceFactory::create($this->company->id, $this->user->id); diff --git a/tests/Feature/RefundTest.php b/tests/Feature/RefundTest.php index a187fe49cb5d..3b5b246da49c 100644 --- a/tests/Feature/RefundTest.php +++ b/tests/Feature/RefundTest.php @@ -11,22 +11,22 @@ namespace Tests\Feature; -use Tests\TestCase; -use App\Models\Credit; -use App\Models\Invoice; -use App\Models\Payment; -use Tests\MockAccountData; -use App\Models\ClientContact; use App\Factory\ClientFactory; use App\Factory\CreditFactory; use App\Factory\InvoiceFactory; -use App\Utils\Traits\MakesHash; use App\Helpers\Invoice\InvoiceSum; +use App\Models\ClientContact; +use App\Models\Credit; +use App\Models\Invoice; +use App\Models\Payment; +use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; +use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Routing\Middleware\ThrottleRequests; use Illuminate\Support\Facades\Session; use Illuminate\Validation\ValidationException; -use Illuminate\Routing\Middleware\ThrottleRequests; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -123,10 +123,10 @@ class RefundTest extends TestCase $response = false; - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->postJson('/api/v1/payments/refund', $data); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/payments/refund', $data); $arr = $response->json(); @@ -219,11 +219,11 @@ class RefundTest extends TestCase 'date' => '2020/12/12', ]; - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->postJson('/api/v1/payments/refund', $data); - $response->assertStatus(422); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/payments/refund', $data); + $response->assertStatus(422); } @@ -294,7 +294,7 @@ class RefundTest extends TestCase $i = $this->invoice->fresh(); $this->assertEquals(0, $i->balance); - $this->assertEquals(round($this->invoice->amount,2), round($i->paid_to_date,2)); + $this->assertEquals(round($this->invoice->amount, 2), round($i->paid_to_date, 2)); $data = [ 'id' => $this->encodePrimaryKey($payment->id), diff --git a/tests/Feature/ReminderTest.php b/tests/Feature/ReminderTest.php index 6e2ee4fd28f8..f3fe49fe714a 100644 --- a/tests/Feature/ReminderTest.php +++ b/tests/Feature/ReminderTest.php @@ -11,23 +11,23 @@ namespace Tests\Feature; -use Tests\TestCase; -use App\Models\User; -use App\Models\Client; -use App\Models\Account; -use App\Models\Company; -use App\Models\Invoice; -use Tests\MockAccountData; -use App\Models\CompanyToken; -use App\Models\ClientContact; -use App\Jobs\Util\ReminderJob; -use Illuminate\Support\Carbon; -use App\Utils\Traits\MakesHash; use App\DataMapper\CompanySettings; use App\Factory\CompanyUserFactory; +use App\Jobs\Util\ReminderJob; +use App\Models\Account; +use App\Models\Client; +use App\Models\ClientContact; +use App\Models\Company; +use App\Models\CompanyToken; +use App\Models\Invoice; +use App\Models\User; +use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; -use Illuminate\Routing\Middleware\ThrottleRequests; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Routing\Middleware\ThrottleRequests; +use Illuminate\Support\Carbon; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -89,8 +89,7 @@ class ReminderTest extends TestCase 'email' => $this->faker->unique()->safeEmail(), ]); - if(!$settings) - { + if(!$settings) { $settings = CompanySettings::defaults(); $settings->client_online_payment_notification = false; $settings->client_manual_payment_notification = false; @@ -247,29 +246,29 @@ class ReminderTest extends TestCase $this->assertEquals(101, $fee->cost); $this->assertEquals('Fee added '.now()->format('d/M/Y'), $fee->notes); - $this->travelTo(now()->addDay()->startOfDay()->addHour()); + $this->travelTo(now()->addDay()->startOfDay()->addHour()); - (new ReminderJob())->handle(); - $this->invoice = $this->invoice->fresh(); - $this->assertNotNull($this->invoice->reminder2_sent); - $this->assertNotNull($this->invoice->reminder_last_sent); + (new ReminderJob())->handle(); + $this->invoice = $this->invoice->fresh(); + $this->assertNotNull($this->invoice->reminder2_sent); + $this->assertNotNull($this->invoice->reminder_last_sent); - $fee = collect($this->invoice->line_items)->where('cost', 102)->first(); + $fee = collect($this->invoice->line_items)->where('cost', 102)->first(); - $this->assertEquals(102, $fee->cost); - $this->assertEquals('Fee added '.now()->format('d/M/Y'), $fee->notes); + $this->assertEquals(102, $fee->cost); + $this->assertEquals('Fee added '.now()->format('d/M/Y'), $fee->notes); - $this->travelTo(now()->addDay()->startOfDay()->addHour()); + $this->travelTo(now()->addDay()->startOfDay()->addHour()); - (new ReminderJob())->handle(); - $this->invoice = $this->invoice->fresh(); - $this->assertNotNull($this->invoice->reminder3_sent); - $this->assertNotNull($this->invoice->reminder_last_sent); + (new ReminderJob())->handle(); + $this->invoice = $this->invoice->fresh(); + $this->assertNotNull($this->invoice->reminder3_sent); + $this->assertNotNull($this->invoice->reminder_last_sent); - $fee = collect($this->invoice->line_items)->where('cost', 103)->first(); + $fee = collect($this->invoice->line_items)->where('cost', 103)->first(); - $this->assertEquals(103, $fee->cost); - $this->assertEquals('Fee added '.now()->format('d/M/Y'), $fee->notes); + $this->assertEquals(103, $fee->cost); + $this->assertEquals('Fee added '.now()->format('d/M/Y'), $fee->notes); $this->travelBack(); @@ -337,7 +336,7 @@ class ReminderTest extends TestCase } - if(!$x){ + if(!$x) { $this->invoice = $this->invoice->fresh(); $this->assertNull($this->invoice->reminder1_sent); $this->assertNull($this->invoice->reminder_last_sent); diff --git a/tests/Feature/Scheduler/ScheduleEntityTest.php b/tests/Feature/Scheduler/ScheduleEntityTest.php index 3bb8e36d8140..05b1ec9904c9 100644 --- a/tests/Feature/Scheduler/ScheduleEntityTest.php +++ b/tests/Feature/Scheduler/ScheduleEntityTest.php @@ -11,17 +11,13 @@ namespace Tests\Feature\Scheduler; -use Carbon\Carbon; -use Tests\TestCase; -use App\Models\Client; -use App\Models\Scheduler; -use Tests\MockAccountData; -use App\Utils\Traits\MakesHash; use App\Models\RecurringInvoice; -use App\Factory\SchedulerFactory; +use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\Session; use Illuminate\Routing\Middleware\ThrottleRequests; +use Illuminate\Support\Facades\Session; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -96,7 +92,7 @@ class ScheduleEntityTest extends TestCase } - public function testSchedulerStore4() + public function testSchedulerStore4() { $data = [ @@ -119,4 +115,4 @@ class ScheduleEntityTest extends TestCase } -} \ No newline at end of file +} diff --git a/tests/Feature/Scheduler/SchedulerTest.php b/tests/Feature/Scheduler/SchedulerTest.php index faeaaa573947..56b70ab5c230 100644 --- a/tests/Feature/Scheduler/SchedulerTest.php +++ b/tests/Feature/Scheduler/SchedulerTest.php @@ -11,22 +11,22 @@ namespace Tests\Feature\Scheduler; -use Carbon\Carbon; -use Tests\TestCase; -use App\Models\Client; -use App\Models\Scheduler; -use Tests\MockAccountData; -use App\Utils\Traits\MakesHash; -use App\Models\RecurringInvoice; -use App\Factory\SchedulerFactory; -use App\Services\Scheduler\EmailReport; -use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\Session; use App\DataMapper\Schedule\EmailStatement; -use Illuminate\Validation\ValidationException; +use App\Factory\SchedulerFactory; +use App\Models\Client; +use App\Models\RecurringInvoice; +use App\Models\Scheduler; +use App\Services\Scheduler\EmailReport; use App\Services\Scheduler\EmailStatementService; -use Illuminate\Routing\Middleware\ThrottleRequests; +use App\Utils\Traits\MakesHash; +use Carbon\Carbon; +use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Routing\Middleware\ThrottleRequests; +use Illuminate\Support\Facades\Session; +use Illuminate\Validation\ValidationException; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -83,7 +83,7 @@ class SchedulerTest extends TestCase 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/task_schedulers', $data); - $response->assertStatus(422); + $response->assertStatus(422); } @@ -114,8 +114,7 @@ class SchedulerTest extends TestCase ])->postJson('/api/v1/task_schedulers', $data); $response->assertStatus(200); - } - catch(\Exception $e){ + } catch(\Exception $e) { nlog($e->getMessage()); } @@ -162,8 +161,7 @@ class SchedulerTest extends TestCase ])->postJson('/api/v1/task_schedulers', $data); $response->assertStatus(200); - } - catch(\Exception $e){ + } catch(\Exception $e) { nlog($e->getMessage()); } @@ -208,8 +206,7 @@ class SchedulerTest extends TestCase ])->postJson('/api/v1/task_schedulers', $data); $response->assertStatus(200); - } - catch(\Exception $e){ + } catch(\Exception $e) { nlog($e->getMessage()); } @@ -385,7 +382,7 @@ class SchedulerTest extends TestCase 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/task_schedulers', $data); - $response->assertStatus(422); + $response->assertStatus(422); @@ -410,7 +407,7 @@ class SchedulerTest extends TestCase 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/task_schedulers', $data); - $response->assertStatus(422); + $response->assertStatus(422); } diff --git a/tests/Feature/Search/SearchApiTest.php b/tests/Feature/Search/SearchApiTest.php index e04804e721b7..5a8318f46335 100644 --- a/tests/Feature/Search/SearchApiTest.php +++ b/tests/Feature/Search/SearchApiTest.php @@ -11,11 +11,10 @@ namespace Tests\Feature\Search; -use Tests\TestCase; -use Tests\MockAccountData; -use Illuminate\Validation\ValidationException; -use Illuminate\Routing\Middleware\ThrottleRequests; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Routing\Middleware\ThrottleRequests; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -58,4 +57,4 @@ class SearchApiTest extends TestCase } -} \ No newline at end of file +} diff --git a/tests/Feature/TaskApiTest.php b/tests/Feature/TaskApiTest.php index f9ce62a62f34..b4a0a06e2ee5 100644 --- a/tests/Feature/TaskApiTest.php +++ b/tests/Feature/TaskApiTest.php @@ -12,16 +12,16 @@ namespace Tests\Feature; use App\DataMapper\ClientSettings; -use Tests\TestCase; -use App\Models\Task; use App\Models\Client; use App\Models\Project; -use Tests\MockAccountData; +use App\Models\Task; use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; +use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Support\Facades\Session; use Illuminate\Validation\ValidationException; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -219,8 +219,8 @@ class TaskApiTest extends TestCase public function testTaskTimelogParse() { $data = [ - "description" => "xx", - "rate" => "6574", + "description" => "xx", + "rate" => "6574", "time_log" => "[[Oct 31, 2023 12:00 am,Oct 31, 2023 1:00 am]]" ]; @@ -434,12 +434,11 @@ class TaskApiTest extends TestCase $logs = [ '[[1680302433,1680387960,"",true]]', '[[1680715620,1680722820,"",true],[1680729660,1680737460,"",true]]', - '[[1681156840,1681158000,"",true]]', + '[[1681156840,1681158000,"",true]]', '[[1680035007,1680036807,"",true]]', ]; - foreach($logs as $log) - { + foreach($logs as $log) { $this->assertTrue($this->checkTimeLog(json_decode($log))); } @@ -462,8 +461,7 @@ class TaskApiTest extends TestCase "[[1681156881,0]]", ]; - foreach($logs as $log) - { + foreach($logs as $log) { $this->assertTrue($this->checkTimeLog(json_decode($log))); } @@ -725,12 +723,12 @@ class TaskApiTest extends TestCase 'time_log' => $this->faker->firstName(), ]; - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->postJson('/api/v1/tasks', $data); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/tasks', $data); - $response->assertStatus(422); + $response->assertStatus(422); } diff --git a/tests/Feature/TaxRateApiTest.php b/tests/Feature/TaxRateApiTest.php index e8175ea78948..f52f48745d36 100644 --- a/tests/Feature/TaxRateApiTest.php +++ b/tests/Feature/TaxRateApiTest.php @@ -11,15 +11,14 @@ namespace Tests\Feature; -use Tests\TestCase; -use App\Models\Company; use App\Models\TaxRate; -use Tests\MockAccountData; use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; +use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Support\Facades\Session; use Illuminate\Validation\ValidationException; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test diff --git a/tests/Feature/Template/TemplateTest.php b/tests/Feature/Template/TemplateTest.php index 446362f10076..6df4507bca59 100644 --- a/tests/Feature/Template/TemplateTest.php +++ b/tests/Feature/Template/TemplateTest.php @@ -11,30 +11,30 @@ namespace Tests\Feature\Template; -use Tests\TestCase; -use App\Utils\Ninja; -use App\Utils\Number; +use App\Jobs\Entity\CreateRawPdf; use App\Models\Credit; use App\Models\Design; use App\Models\Invoice; use App\Models\Payment; use App\Models\Project; -use App\Utils\HtmlEngine; -use Tests\MockAccountData; -use App\Utils\Traits\MakesDates; -use App\Jobs\Entity\CreateRawPdf; -use App\Services\PdfMaker\PdfMaker; -use Illuminate\Support\Facades\App; -use App\Services\Template\TemplateMock; -use App\Services\Template\TemplateService; use App\Services\PdfMaker\Design as PdfDesignModel; use App\Services\PdfMaker\Design as PdfMakerDesign; -use Illuminate\Routing\Middleware\ThrottleRequests; +use App\Services\PdfMaker\PdfMaker; +use App\Services\Template\TemplateMock; +use App\Services\Template\TemplateService; +use App\Utils\HtmlEngine; +use App\Utils\Ninja; +use App\Utils\Number; +use App\Utils\Traits\MakesDates; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Routing\Middleware\ThrottleRequests; +use Illuminate\Support\Facades\App; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test - * @covers + * @covers */ class TemplateTest extends TestCase { @@ -74,7 +74,7 @@ class TemplateTest extends TestCase '; - private string $nested_body = ' + private string $nested_body = ' $company.name @@ -108,7 +108,7 @@ class TemplateTest extends TestCase '; - private string $payments_body = ' + private string $payments_body = ' CoName: $company.name ClName: $client.name InNumber: $invoice.number @@ -262,7 +262,7 @@ class TemplateTest extends TestCase public function testNegativeDivAttribute() { - $dom = new \DOMDocument(); + $dom = new \DOMDocument(); @$dom->loadHTML(mb_convert_encoding($this->stack, 'HTML-ENTITIES', 'UTF-8')); $node = $dom->getElementById('company-details'); @@ -324,9 +324,9 @@ class TemplateTest extends TestCase 'balance' => 100, ]); - $invoices = Invoice::orderBy('id','desc')->where('client_id', $this->client->id)->take(10)->get()->map(function($c){ + $invoices = Invoice::orderBy('id', 'desc')->where('client_id', $this->client->id)->take(10)->get()->map(function ($c) { return $c->service()->markSent()->applyNumber()->save(); - })->map(function ($i){ + })->map(function ($i) { return ['invoice_id' => $i->hashed_id, 'amount' => rand(0, $i->balance)]; })->toArray(); @@ -339,7 +339,7 @@ class TemplateTest extends TestCase 'balance' => 50, ]); - $credits = Credit::orderBy('id', 'desc')->where('client_id', $this->client->id)->take(2)->get()->map(function($c){ + $credits = Credit::orderBy('id', 'desc')->where('client_id', $this->client->id)->take(2)->get()->map(function ($c) { return $c->service()->markSent()->applyNumber()->save(); })->map(function ($i) { return ['credit_id' => $i->hashed_id, 'amount' => rand(0, $i->balance)]; @@ -365,10 +365,10 @@ class TemplateTest extends TestCase $start = microtime(true); - $p = Payment::with('client','invoices','paymentables','credits') + $p = Payment::with('client', 'invoices', 'paymentables', 'credits') ->where('id', $this->decodePrimaryKey($arr['data']['id'])) ->cursor() - ->map(function ($payment){ + ->map(function ($payment) { $this->transformPayment($payment); @@ -383,15 +383,15 @@ class TemplateTest extends TestCase \DB::enableQueryLog(); - $invoices = Invoice::with('client','payments.client','payments.paymentables','payments.credits','credits.client') - ->orderBy('id','desc') + $invoices = Invoice::with('client', 'payments.client', 'payments.paymentables', 'payments.credits', 'credits.client') + ->orderBy('id', 'desc') ->where('client_id', $this->client->id) ->take(10) ->get() - ->map(function($invoice){ + ->map(function ($invoice) { $payments = []; - $payments = $invoice->payments->map(function ($payment){ + $payments = $invoice->payments->map(function ($payment) { // nlog(microtime(true)); return $this->transformPayment($payment); })->toArray(); @@ -460,7 +460,7 @@ class TemplateTest extends TestCase private function transformPayment(Payment $payment): array { - $data = []; + $data = []; $credits = $payment->credits->map(function ($credit) use ($payment) { return [ @@ -543,12 +543,12 @@ class TemplateTest extends TestCase 'balance' => 100, ]); - $i = Invoice::orderBy('id','desc') + $i = Invoice::orderBy('id', 'desc') ->where('client_id', $this->client->id) ->where('status_id', 2) ->cursor() - ->each(function ($i){ - $i->service()->applyPaymentAmount(random_int(1,100)); + ->each(function ($i) { + $i->service()->applyPaymentAmount(random_int(1, 100)); }); $invoices = Invoice::withTrashed() @@ -561,35 +561,35 @@ class TemplateTest extends TestCase ->orderBy('date', 'ASC') ->cursor(); - $invoices->each(function ($i){ + $invoices->each(function ($i) { - $rand = [1,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,24,25,32,49,50]; + $rand = [1,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,24,25,32,49,50]; - $i->payments()->each(function ($p) use ($rand){ - shuffle($rand); - $p->type_id = $rand[0]; - $p->save(); + $i->payments()->each(function ($p) use ($rand) { + shuffle($rand); + $p->type_id = $rand[0]; + $p->save(); - }); }); + }); - $design_model = Design::find(2); + $design_model = Design::find(2); - $replicated_design = $design_model->replicate(); - $replicated_design->company_id = $this->company->id; - $replicated_design->user_id = $this->user->id; - $design = $replicated_design->design; - $design->body .= $this->payments_body; - $replicated_design->design = $design; - $replicated_design->is_custom = true; - $replicated_design->is_template =true; - $replicated_design->entities = 'client'; - $replicated_design->save(); + $replicated_design = $design_model->replicate(); + $replicated_design->company_id = $this->company->id; + $replicated_design->user_id = $this->user->id; + $design = $replicated_design->design; + $design->body .= $this->payments_body; + $replicated_design->design = $design; + $replicated_design->is_custom = true; + $replicated_design->is_template =true; + $replicated_design->entities = 'client'; + $replicated_design->save(); - $data['invoices'] = $invoices; - $ts = $replicated_design->service()->build($data); + $data['invoices'] = $invoices; + $ts = $replicated_design->service()->build($data); - $this->assertNotNull($ts->getHtml()); + $this->assertNotNull($ts->getHtml()); } @@ -764,15 +764,15 @@ class TemplateTest extends TestCase $design->user_id = $this->invoice->user_id; $design->company_id = $this->invoice->company_id; - $design_object = new \stdClass; - $design_object->includes = ''; - $design_object->header = ''; - $design_object->body = $this->body; - $design_object->product = ''; - $design_object->task = ''; - $design_object->footer = ''; + $design_object = new \stdClass; + $design_object->includes = ''; + $design_object->header = ''; + $design_object->body = $this->body; + $design_object->product = ''; + $design_object->task = ''; + $design_object->footer = ''; - $design->design = $design_object; + $design->design = $design_object; $design->save(); @@ -827,4 +827,4 @@ class TemplateTest extends TestCase nlog("Twig Solo Gen Time: ". $end - $start); } -} \ No newline at end of file +} diff --git a/tests/Feature/UpdatePaymentTest.php b/tests/Feature/UpdatePaymentTest.php index 9b7054b7f563..603416ef1238 100644 --- a/tests/Feature/UpdatePaymentTest.php +++ b/tests/Feature/UpdatePaymentTest.php @@ -11,18 +11,17 @@ namespace Tests\Feature; -use Carbon\Carbon; -use Tests\TestCase; -use App\Models\Client; -use Tests\MockAccountData; use App\Factory\InvoiceFactory; -use App\Utils\Traits\MakesHash; use App\Helpers\Invoice\InvoiceSum; +use App\Models\Client; +use App\Utils\Traits\MakesHash; +use Carbon\Carbon; +use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Routing\Middleware\ThrottleRequests; use Illuminate\Support\Facades\Session; use Illuminate\Validation\ValidationException; -use Illuminate\Foundation\Testing\WithoutEvents; -use Illuminate\Routing\Middleware\ThrottleRequests; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -60,7 +59,7 @@ class UpdatePaymentTest extends TestCase $this->assertNotNull($payment); - $payment->paymentables()->each(function ($pivot){ + $payment->paymentables()->each(function ($pivot) { $this->assertTrue(Carbon::createFromTimestamp($pivot->created_at)->isToday()); }); diff --git a/tests/Feature/UserTest.php b/tests/Feature/UserTest.php index b030e4b3bf53..180a1fef8706 100644 --- a/tests/Feature/UserTest.php +++ b/tests/Feature/UserTest.php @@ -11,21 +11,21 @@ namespace Tests\Feature; -use Tests\TestCase; -use App\Models\User; -use App\Models\Account; -use App\Models\Company; -use Tests\MockAccountData; -use App\Models\CompanyUser; -use App\Models\CompanyToken; use App\DataMapper\CompanySettings; use App\Factory\CompanyUserFactory; -use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\Session; use App\Http\Middleware\PasswordProtection; -use Illuminate\Validation\ValidationException; -use Illuminate\Routing\Middleware\ThrottleRequests; +use App\Models\Account; +use App\Models\Company; +use App\Models\CompanyToken; +use App\Models\CompanyUser; +use App\Models\User; +use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Routing\Middleware\ThrottleRequests; +use Illuminate\Support\Facades\Session; +use Illuminate\Validation\ValidationException; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -284,7 +284,7 @@ class UserTest extends TestCase public function testDisconnectUserOauthMailer() { - $user = + $user = User::factory()->create([ 'account_id' => $this->account->id, 'email' => $this->faker->safeEmail(), diff --git a/tests/Feature/VendorApiTest.php b/tests/Feature/VendorApiTest.php index f42178a26a10..386a691e9b5f 100644 --- a/tests/Feature/VendorApiTest.php +++ b/tests/Feature/VendorApiTest.php @@ -11,16 +11,16 @@ namespace Tests\Feature; -use Tests\TestCase; -use App\Utils\Ninja; -use Tests\MockAccountData; -use App\Utils\Traits\MakesHash; -use Illuminate\Support\Facades\Event; -use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\Session; use App\Events\Vendor\VendorContactLoggedIn; -use Illuminate\Validation\ValidationException; +use App\Utils\Ninja; +use App\Utils\Traits\MakesHash; +use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Support\Facades\Event; +use Illuminate\Support\Facades\Session; +use Illuminate\Validation\ValidationException; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -63,7 +63,7 @@ class VendorApiTest extends TestCase $this->assertEquals('hewwo', $arr['data']['name']); $this->assertEquals(1, count($arr['data']['contacts'])); - } + } public function testVendorLoggedInEvents() { @@ -111,7 +111,7 @@ class VendorApiTest extends TestCase } public function testVendorLocaleEnCompanyFallback() - { + { $settings = $this->company->settings; $settings->language_id = '2'; diff --git a/tests/Feature/WebhookAPITest.php b/tests/Feature/WebhookAPITest.php index 2d62be234cab..4ca7a1d659c3 100644 --- a/tests/Feature/WebhookAPITest.php +++ b/tests/Feature/WebhookAPITest.php @@ -11,7 +11,6 @@ namespace Tests\Feature; -use App\Jobs\Util\WebhookSingle; use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Testing\DatabaseTransactions; @@ -49,33 +48,33 @@ class WebhookAPITest extends TestCase public function testWebhookRetry() { - $data = [ - 'target_url' => 'http://hook.com', - 'event_id' => 1, //create client - 'format' => 'JSON', - 'headers' => [] - ]; + $data = [ + 'target_url' => 'http://hook.com', + 'event_id' => 1, //create client + 'format' => 'JSON', + 'headers' => [] + ]; - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->postJson("/api/v1/webhooks", $data); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson("/api/v1/webhooks", $data); - $response->assertStatus(200); + $response->assertStatus(200); - $arr = $response->json(); + $arr = $response->json(); - $data = [ - 'entity' => 'client', - 'entity_id' => $this->client->hashed_id, - ]; + $data = [ + 'entity' => 'client', + 'entity_id' => $this->client->hashed_id, + ]; - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->postJson("/api/v1/webhooks/".$arr['data']['id']."/retry", $data); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson("/api/v1/webhooks/".$arr['data']['id']."/retry", $data); - $response->assertStatus(200); + $response->assertStatus(200); } diff --git a/tests/Integration/CompanyLedgerTest.php b/tests/Integration/CompanyLedgerTest.php index 09ef9929590c..b64d8e33e184 100644 --- a/tests/Integration/CompanyLedgerTest.php +++ b/tests/Integration/CompanyLedgerTest.php @@ -11,24 +11,24 @@ namespace Tests\Integration; -use Tests\TestCase; -use App\Models\User; -use App\Models\Client; +use App\DataMapper\CompanySettings; +use App\DataMapper\InvoiceItem; +use App\Factory\CompanyUserFactory; +use App\Jobs\Ledger\UpdateLedger; use App\Models\Account; +use App\Models\Client; +use App\Models\ClientContact; use App\Models\Company; +use App\Models\CompanyLedger; +use App\Models\CompanyToken; use App\Models\Invoice; use App\Models\Payment; -use App\Models\CompanyToken; -use App\Models\ClientContact; -use App\Models\CompanyLedger; -use App\DataMapper\InvoiceItem; +use App\Models\User; use App\Utils\Traits\MakesHash; -use App\Jobs\Ledger\UpdateLedger; -use App\DataMapper\CompanySettings; -use App\Factory\CompanyUserFactory; +use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Support\Facades\Hash; use Illuminate\Validation\ValidationException; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Tests\TestCase; /** @test*/ class CompanyLedgerTest extends TestCase diff --git a/tests/Integration/DTO/AccountSummaryTest.php b/tests/Integration/DTO/AccountSummaryTest.php index d42046920369..eb1f92aeb198 100644 --- a/tests/Integration/DTO/AccountSummaryTest.php +++ b/tests/Integration/DTO/AccountSummaryTest.php @@ -141,4 +141,4 @@ class AccountSummaryTest extends TestCase $this->assertEquals($dto->id, 19315); } -} \ No newline at end of file +} diff --git a/tests/Integration/EventTest.php b/tests/Integration/EventTest.php index e26560691042..3bcbbaff5313 100644 --- a/tests/Integration/EventTest.php +++ b/tests/Integration/EventTest.php @@ -11,79 +11,79 @@ namespace Tests\Integration; -use Tests\TestCase; -use App\Models\Quote; -use App\Models\Invoice; -use Tests\MockAccountData; -use App\Models\PurchaseOrder; -use App\Utils\Traits\MakesHash; -use App\Events\Task\TaskWasCreated; -use App\Events\Task\TaskWasDeleted; -use App\Events\Task\TaskWasUpdated; -use App\Events\User\UserWasCreated; -use App\Events\User\UserWasDeleted; -use App\Events\User\UserWasUpdated; -use App\Events\Task\TaskWasArchived; -use App\Events\Task\TaskWasRestored; -use App\Events\User\UserWasArchived; -use App\Events\User\UserWasRestored; -use App\Events\Quote\QuoteWasCreated; -use App\Events\Quote\QuoteWasDeleted; -use App\Events\Quote\QuoteWasUpdated; -use Illuminate\Support\Facades\Event; -use App\Events\Quote\QuoteWasApproved; -use App\Events\Quote\QuoteWasArchived; -use App\Events\Quote\QuoteWasRestored; +use App\Events\Client\ClientWasArchived; use App\Events\Client\ClientWasCreated; use App\Events\Client\ClientWasDeleted; +use App\Events\Client\ClientWasRestored; use App\Events\Client\ClientWasUpdated; +use App\Events\Credit\CreditWasArchived; use App\Events\Credit\CreditWasCreated; use App\Events\Credit\CreditWasDeleted; -use App\Events\Credit\CreditWasUpdated; -use App\Events\Vendor\VendorWasCreated; -use App\Events\Vendor\VendorWasDeleted; -use App\Events\Vendor\VendorWasUpdated; -use Illuminate\Database\Eloquent\Model; -use App\Events\Client\ClientWasArchived; -use App\Events\Client\ClientWasRestored; -use App\Events\Credit\CreditWasArchived; use App\Events\Credit\CreditWasRestored; -use App\Events\Vendor\VendorWasArchived; -use App\Events\Vendor\VendorWasRestored; +use App\Events\Credit\CreditWasUpdated; +use App\Events\Expense\ExpenseWasArchived; use App\Events\Expense\ExpenseWasCreated; use App\Events\Expense\ExpenseWasDeleted; +use App\Events\Expense\ExpenseWasRestored; use App\Events\Expense\ExpenseWasUpdated; +use App\Events\Invoice\InvoiceWasArchived; use App\Events\Invoice\InvoiceWasCreated; use App\Events\Invoice\InvoiceWasDeleted; +use App\Events\Invoice\InvoiceWasRestored; use App\Events\Invoice\InvoiceWasUpdated; +use App\Events\Payment\PaymentWasArchived; use App\Events\Payment\PaymentWasCreated; use App\Events\Payment\PaymentWasDeleted; -use App\Events\Payment\PaymentWasUpdated; -use App\Events\Expense\ExpenseWasArchived; -use App\Events\Expense\ExpenseWasRestored; -use App\Events\Invoice\InvoiceWasArchived; -use App\Events\Invoice\InvoiceWasRestored; -use App\Events\Payment\PaymentWasArchived; use App\Events\Payment\PaymentWasRestored; -use App\Http\Middleware\PasswordProtection; -use Illuminate\Validation\ValidationException; -use App\Events\Subscription\SubscriptionWasCreated; -use App\Events\Subscription\SubscriptionWasDeleted; -use App\Events\Subscription\SubscriptionWasUpdated; -use Illuminate\Routing\Middleware\ThrottleRequests; -use App\Events\Subscription\SubscriptionWasArchived; -use App\Events\Subscription\SubscriptionWasRestored; +use App\Events\Payment\PaymentWasUpdated; +use App\Events\PurchaseOrder\PurchaseOrderWasArchived; use App\Events\PurchaseOrder\PurchaseOrderWasCreated; use App\Events\PurchaseOrder\PurchaseOrderWasDeleted; -use App\Events\PurchaseOrder\PurchaseOrderWasUpdated; -use App\Events\PurchaseOrder\PurchaseOrderWasArchived; use App\Events\PurchaseOrder\PurchaseOrderWasRestored; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use App\Events\PurchaseOrder\PurchaseOrderWasUpdated; +use App\Events\Quote\QuoteWasApproved; +use App\Events\Quote\QuoteWasArchived; +use App\Events\Quote\QuoteWasCreated; +use App\Events\Quote\QuoteWasDeleted; +use App\Events\Quote\QuoteWasRestored; +use App\Events\Quote\QuoteWasUpdated; +use App\Events\RecurringInvoice\RecurringInvoiceWasArchived; use App\Events\RecurringInvoice\RecurringInvoiceWasCreated; use App\Events\RecurringInvoice\RecurringInvoiceWasDeleted; -use App\Events\RecurringInvoice\RecurringInvoiceWasUpdated; -use App\Events\RecurringInvoice\RecurringInvoiceWasArchived; use App\Events\RecurringInvoice\RecurringInvoiceWasRestored; +use App\Events\RecurringInvoice\RecurringInvoiceWasUpdated; +use App\Events\Subscription\SubscriptionWasArchived; +use App\Events\Subscription\SubscriptionWasCreated; +use App\Events\Subscription\SubscriptionWasDeleted; +use App\Events\Subscription\SubscriptionWasRestored; +use App\Events\Subscription\SubscriptionWasUpdated; +use App\Events\Task\TaskWasArchived; +use App\Events\Task\TaskWasCreated; +use App\Events\Task\TaskWasDeleted; +use App\Events\Task\TaskWasRestored; +use App\Events\Task\TaskWasUpdated; +use App\Events\User\UserWasArchived; +use App\Events\User\UserWasCreated; +use App\Events\User\UserWasDeleted; +use App\Events\User\UserWasRestored; +use App\Events\User\UserWasUpdated; +use App\Events\Vendor\VendorWasArchived; +use App\Events\Vendor\VendorWasCreated; +use App\Events\Vendor\VendorWasDeleted; +use App\Events\Vendor\VendorWasRestored; +use App\Events\Vendor\VendorWasUpdated; +use App\Http\Middleware\PasswordProtection; +use App\Models\Invoice; +use App\Models\PurchaseOrder; +use App\Models\Quote; +use App\Utils\Traits\MakesHash; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Routing\Middleware\ThrottleRequests; +use Illuminate\Support\Facades\Event; +use Illuminate\Validation\ValidationException; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test diff --git a/tests/Integration/FileUploadValidationTest.php b/tests/Integration/FileUploadValidationTest.php index 68cd436739ec..8ffb69b816fe 100644 --- a/tests/Integration/FileUploadValidationTest.php +++ b/tests/Integration/FileUploadValidationTest.php @@ -11,7 +11,6 @@ namespace Tests\Integration; -use App\Models\Company; use App\Utils\Traits\MakesHash; use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Http\UploadedFile; @@ -148,4 +147,4 @@ class FileUploadValidationTest extends TestCase } -} \ No newline at end of file +} diff --git a/tests/Integration/UpdateCompanyUserTest.php b/tests/Integration/UpdateCompanyUserTest.php index 0f9abb8cf59c..4515f2854169 100644 --- a/tests/Integration/UpdateCompanyUserTest.php +++ b/tests/Integration/UpdateCompanyUserTest.php @@ -47,7 +47,7 @@ class UpdateCompanyUserTest extends TestCase 'react_settings' => [ 'show_pdf_preview' => true, 'react_notification_link' => false - ], + ], ]; $response = null; diff --git a/tests/MockAccountData.php b/tests/MockAccountData.php index 25eef773c06a..703b008e356f 100644 --- a/tests/MockAccountData.php +++ b/tests/MockAccountData.php @@ -11,58 +11,58 @@ namespace Tests; -use App\Models\Task; -use App\Models\User; -use App\Models\Quote; -use App\Models\Client; -use App\Models\Credit; -use App\Models\Vendor; -use App\Models\Account; -use App\Models\Company; -use App\Models\Expense; -use App\Models\Payment; -use App\Models\Product; -use App\Models\Project; -use App\Models\TaxRate; -use App\Models\Scheduler; -use App\Models\TaskStatus; -use App\Utils\TruthSource; -use App\Models\CompanyToken; -use App\Models\GroupSetting; -use App\Models\ClientContact; -use App\Models\VendorContact; -use App\Factory\CreditFactory; -use App\Models\CompanyGateway; -use App\Models\RecurringQuote; -use Illuminate\Support\Carbon; -use App\Factory\InvoiceFactory; -use App\Models\BankIntegration; -use App\Models\BankTransaction; -use App\Models\ExpenseCategory; -use App\Models\QuoteInvitation; -use App\Utils\Traits\MakesHash; -use App\Models\CreditInvitation; -use App\Models\RecurringExpense; -use App\Models\RecurringInvoice; -use App\Models\InvoiceInvitation; +use App\DataMapper\ClientRegistrationFields; use App\DataMapper\ClientSettings; use App\DataMapper\CompanySettings; use App\Factory\CompanyUserFactory; -use App\Factory\InvoiceItemFactory; -use App\Helpers\Invoice\InvoiceSum; -use App\Models\BankTransactionRule; -use Illuminate\Support\Facades\Hash; -use App\Factory\PurchaseOrderFactory; -use Illuminate\Support\Facades\Cache; -use App\Utils\Traits\GeneratesCounter; -use Illuminate\Support\Facades\Schema; -use App\Models\PurchaseOrderInvitation; -use Illuminate\Support\Facades\Artisan; -use Illuminate\Support\Facades\Storage; +use App\Factory\CreditFactory; +use App\Factory\InvoiceFactory; use App\Factory\InvoiceInvitationFactory; -use App\DataMapper\ClientRegistrationFields; -use App\Jobs\Company\CreateCompanyTaskStatuses; +use App\Factory\InvoiceItemFactory; use App\Factory\InvoiceToRecurringInvoiceFactory; +use App\Factory\PurchaseOrderFactory; +use App\Helpers\Invoice\InvoiceSum; +use App\Jobs\Company\CreateCompanyTaskStatuses; +use App\Models\Account; +use App\Models\BankIntegration; +use App\Models\BankTransaction; +use App\Models\BankTransactionRule; +use App\Models\Client; +use App\Models\ClientContact; +use App\Models\Company; +use App\Models\CompanyGateway; +use App\Models\CompanyToken; +use App\Models\Credit; +use App\Models\CreditInvitation; +use App\Models\Expense; +use App\Models\ExpenseCategory; +use App\Models\GroupSetting; +use App\Models\InvoiceInvitation; +use App\Models\Payment; +use App\Models\Product; +use App\Models\Project; +use App\Models\PurchaseOrderInvitation; +use App\Models\Quote; +use App\Models\QuoteInvitation; +use App\Models\RecurringExpense; +use App\Models\RecurringInvoice; +use App\Models\RecurringQuote; +use App\Models\Scheduler; +use App\Models\Task; +use App\Models\TaskStatus; +use App\Models\TaxRate; +use App\Models\User; +use App\Models\Vendor; +use App\Models\VendorContact; +use App\Utils\Traits\GeneratesCounter; +use App\Utils\Traits\MakesHash; +use App\Utils\TruthSource; +use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\Artisan; +use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\Hash; +use Illuminate\Support\Facades\Schema; +use Illuminate\Support\Facades\Storage; /** * Class MockAccountData. diff --git a/tests/MockUnitData.php b/tests/MockUnitData.php index fcf7c3e1841f..98368268c981 100644 --- a/tests/MockUnitData.php +++ b/tests/MockUnitData.php @@ -11,16 +11,16 @@ namespace Tests; -use App\Models\User; -use App\Models\Client; -use App\Models\Vendor; -use App\Models\Account; -use App\Models\Company; -use App\Models\CompanyToken; -use App\Models\ClientContact; use App\DataMapper\CompanySettings; use App\DataMapper\DefaultSettings; use App\Factory\InvoiceItemFactory; +use App\Models\Account; +use App\Models\Client; +use App\Models\ClientContact; +use App\Models\Company; +use App\Models\CompanyToken; +use App\Models\User; +use App\Models\Vendor; /** * Class MockUnitData. diff --git a/tests/Pdf/PdfServiceTest.php b/tests/Pdf/PdfServiceTest.php index 625783cef598..1eec2d40ae3e 100644 --- a/tests/Pdf/PdfServiceTest.php +++ b/tests/Pdf/PdfServiceTest.php @@ -14,7 +14,6 @@ namespace Tests\Pdf; use App\Services\Pdf\PdfConfiguration; use App\Services\Pdf\PdfService; -use Beganovich\Snappdf\Snappdf; use Tests\MockAccountData; use Tests\TestCase; @@ -36,8 +35,9 @@ class PdfServiceTest extends TestCase public function testPdfGeneration() { - if(config('ninja.testvars.travis')) + if(config('ninja.testvars.travis')) { $this->markTestSkipped(); + } $invitation = $this->invoice->invitations->first(); @@ -111,4 +111,4 @@ class PdfServiceTest extends TestCase } -} \ No newline at end of file +} diff --git a/tests/Pdf/PdfmockTest.php b/tests/Pdf/PdfmockTest.php index 940969783831..4bbc8c2cd9ed 100644 --- a/tests/Pdf/PdfmockTest.php +++ b/tests/Pdf/PdfmockTest.php @@ -12,20 +12,18 @@ namespace Tests\Pdf; -use Tests\TestCase; -use App\Models\Design; +use App\DataMapper\CompanySettings; use App\Models\Account; use App\Models\Company; use App\Models\Country; -use App\Models\Invoice; use App\Models\Currency; -use Tests\MockAccountData; -use App\Services\Pdf\PdfMock; -use Beganovich\Snappdf\Snappdf; +use App\Models\Design; +use App\Models\Invoice; use App\Services\Pdf\PdfBuilder; -use App\Services\Pdf\PdfService; -use App\DataMapper\CompanySettings; use App\Services\Pdf\PdfConfiguration; +use App\Services\Pdf\PdfMock; +use App\Services\Pdf\PdfService; +use Tests\TestCase; /** * @test @@ -40,7 +38,7 @@ class PdfmockTest extends TestCase } - public function testPdfInstance () + public function testPdfInstance() { $data = [ 'settings' => CompanySettings::defaults(), @@ -52,7 +50,7 @@ class PdfmockTest extends TestCase $account = Account::factory()->make(); $company->setRelation('account', $account); - $entity = (new \App\Services\Pdf\PdfMock($data,$company))->build()->initEntity(); + $entity = (new \App\Services\Pdf\PdfMock($data, $company))->build()->initEntity(); $this->assertInstanceOf(Invoice::class, $entity); $this->assertNotNull($entity->client); diff --git a/tests/TestCase.php b/tests/TestCase.php index df4697ddbf7c..2932d4a69d65 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -2,7 +2,6 @@ namespace Tests; -use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\TestCase as BaseTestCase; abstract class TestCase extends BaseTestCase diff --git a/tests/Unit/ArrayFiltersTest.php b/tests/Unit/ArrayFiltersTest.php index 5351ad1c09d7..ca3de4d7ccff 100644 --- a/tests/Unit/ArrayFiltersTest.php +++ b/tests/Unit/ArrayFiltersTest.php @@ -11,10 +11,10 @@ namespace Tests\Unit; -use Tests\TestCase; -use App\Models\User; use App\Models\Design; use App\Models\Payment; +use App\Models\User; +use Tests\TestCase; /** * @test @@ -27,13 +27,13 @@ class ArrayFiltersTest extends TestCase 'baseline' =>[], '5.7.34' => [ Payment::class => [ - 'is_deleted', + 'is_deleted', 'amount', ] ], '5.7.35' => [ Payment::class => [ - 'date', + 'date', 'transaction_reference', ], User::class => [ @@ -47,13 +47,13 @@ class ArrayFiltersTest extends TestCase ], '5.7.36' => [ Payment::class => [ - 'type_id', + 'type_id', 'status_id', ], ], '5.7.37' => [ Payment::class => [ - 'currency_id', + 'currency_id', 'hashed_id', ], ], @@ -83,10 +83,8 @@ class ArrayFiltersTest extends TestCase $index = 0; $version_index = 0; - foreach($this->version_keys as $key => $value) - { - if($version == $key) - { + foreach($this->version_keys as $key => $value) { + if($version == $key) { $version_index = $index; } @@ -104,7 +102,7 @@ class ArrayFiltersTest extends TestCase $this->assertEquals(4, $x->count()); } - public function testPaymentUnsetPropsScenario2() + public function testPaymentUnsetPropsScenario2() { $p = Payment::factory()->make()->toArray(); @@ -116,10 +114,8 @@ class ArrayFiltersTest extends TestCase $index = 0; $version_index = 0; - foreach($this->version_keys as $key => $value) - { - if($version == $key) - { + foreach($this->version_keys as $key => $value) { + if($version == $key) { $version_index = $index; } @@ -133,8 +129,9 @@ class ArrayFiltersTest extends TestCase $filters = collect($this->version_keys) ->map(function ($value, $key) use ($version, &$version_index, &$index) { - if($version == $key) + if($version == $key) { $version_index = $index; + } $index++; return $value; @@ -150,7 +147,7 @@ class ArrayFiltersTest extends TestCase $this->assertEquals(2, $x->count()); } - public function testWhenScenario() + public function testWhenScenario() { $p = Payment::factory()->make()->toArray(); @@ -159,8 +156,9 @@ class ArrayFiltersTest extends TestCase $filters = collect($this->version_keys) ->map(function ($value, $key) use ($version, &$version_index, &$index) { - if($version == $key) + if($version == $key) { $version_index = $index; + } $index++; return $value; @@ -172,7 +170,7 @@ class ArrayFiltersTest extends TestCase $this->assertEquals(3, $filters->count()); } - public function testWhenScenario2() + public function testWhenScenario2() { $p = Payment::factory()->make()->toArray(); @@ -183,7 +181,7 @@ class ArrayFiltersTest extends TestCase ->map(function ($value, $key) use ($version, &$version_index, &$index) { if($version == $key) { $version_index = $index; - nlog("version = {$version_index}"); + nlog("version = {$version_index}"); } $index++; return $value; @@ -203,26 +201,26 @@ class ArrayFiltersTest extends TestCase $index = 0; $version_index = 0; - $filters = collect($this->version_keys) - ->map(function ($value, $key) use (&$version_index, &$index) { - if($this->import_version == $key) { - $version_index = $index; - } + $filters = collect($this->version_keys) + ->map(function ($value, $key) use (&$version_index, &$index) { + if($this->import_version == $key) { + $version_index = $index; + } - $index++; - return $value; + $index++; + return $value; - }) - ->when($version_index == 0, function ($collection){ - return collect([]); - }) - ->when($version_index > 0, function ($collection) use (&$version_index, $class) { - return $collection->slice($version_index)->pluck($class)->filter(); - }); + }) + ->when($version_index == 0, function ($collection) { + return collect([]); + }) + ->when($version_index > 0, function ($collection) use (&$version_index, $class) { + return $collection->slice($version_index)->pluck($class)->filter(); + }); - return collect($obj_array)->diffKeys($filters->flatten()->flip())->toArray(); + return collect($obj_array)->diffKeys($filters->flatten()->flip())->toArray(); - // return $filters->count() > 0 ? collect($obj_array)->diffKeys($filters->flatten()->flip())->toArray() : $obj_array; + // return $filters->count() > 0 ? collect($obj_array)->diffKeys($filters->flatten()->flip())->toArray() : $obj_array; } diff --git a/tests/Unit/CheckDataTest.php b/tests/Unit/CheckDataTest.php index 2de8f3d26416..a81a464b5ebf 100644 --- a/tests/Unit/CheckDataTest.php +++ b/tests/Unit/CheckDataTest.php @@ -11,21 +11,19 @@ namespace Tests\Unit; -use Tests\TestCase; -use App\Models\User; -use App\Utils\Ninja; -use App\Models\Client; +use App\DataMapper\CompanySettings; +use App\Factory\CompanyUserFactory; use App\Models\Account; +use App\Models\Client; +use App\Models\ClientContact; use App\Models\Company; +use App\Models\CompanyToken; use App\Models\Invoice; use App\Models\Payment; use App\Models\Paymentable; -use Illuminate\Support\Str; -use App\Models\CompanyToken; -use App\Models\ClientContact; -use App\DataMapper\CompanySettings; -use App\Factory\CompanyUserFactory; +use App\Models\User; use Illuminate\Routing\Middleware\ThrottleRequests; +use Tests\TestCase; /** * @test @@ -141,7 +139,7 @@ class CheckDataTest extends TestCase }); - Payment::with('paymentables')->cursor()->each(function($payment){ + Payment::with('paymentables')->cursor()->each(function ($payment) { $this->assertNotNull($payment->paymentables()->where('paymentable_type', \App\Models\Credit::class)->get() ->sum(\DB::raw('amount')->getValue(\DB::connection()->getQueryGrammar()))); }); @@ -168,8 +166,8 @@ class CheckDataTest extends TestCase ]); $clients_refactor = \DB::table('clients') - ->leftJoin('client_contacts', function ($join){ - $join->on('client_contacts.client_id', '=', 'clients.id'); + ->leftJoin('client_contacts', function ($join) { + $join->on('client_contacts.client_id', '=', 'clients.id'); }) ->get(['clients.id', \DB::raw('count(client_contacts.id) as contact_count')]); diff --git a/tests/Unit/ClientSettingsTest.php b/tests/Unit/ClientSettingsTest.php index e0200d021628..5d520811d5ae 100644 --- a/tests/Unit/ClientSettingsTest.php +++ b/tests/Unit/ClientSettingsTest.php @@ -73,10 +73,10 @@ class ClientSettingsTest extends TestCase $response = false; - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->postJson('/api/v1/clients/', $data); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/clients/', $data); $response->assertStatus(200); @@ -232,10 +232,10 @@ class ClientSettingsTest extends TestCase $response = false; - $response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, - ])->postJson('/api/v1/clients/', $data); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/clients/', $data); $response->assertStatus(422); diff --git a/tests/Unit/CompanyDocumentsTest.php b/tests/Unit/CompanyDocumentsTest.php index 0675197caccf..a4e6e490bdfe 100644 --- a/tests/Unit/CompanyDocumentsTest.php +++ b/tests/Unit/CompanyDocumentsTest.php @@ -66,47 +66,47 @@ class CompanyDocumentsTest extends TestCase // $this->assertFalse(Storage::exists($document->url)); } -// public function testSignedRoutes() -// { + // public function testSignedRoutes() + // { -// $company_key = $this->company->company_key; + // $company_key = $this->company->company_key; -// $original_count = Document::whereCompanyId($this->company->id)->count(); + // $original_count = Document::whereCompanyId($this->company->id)->count(); -// $image = UploadedFile::fake()->image('avatar.jpg'); + // $image = UploadedFile::fake()->image('avatar.jpg'); -// $document = (new UploadFile( -// $image, -// UploadFile::IMAGE, -// $this->user, -// $this->company, -// $this->invoice))->handle(); + // $document = (new UploadFile( + // $image, + // UploadFile::IMAGE, + // $this->user, + // $this->company, + // $this->invoice))->handle(); -// $this->assertNotNull($document); + // $this->assertNotNull($document); -// // $url = \Illuminate\Support\Facades\URL::signedRoute('api.documents.show', ['document' => $document->hashed_id]); -// $url = \Illuminate\Support\Facades\URL::signedRoute('documents.public_download', ['document_hash' => $document->hash]); - -// nlog($url); + // // $url = \Illuminate\Support\Facades\URL::signedRoute('api.documents.show', ['document' => $document->hashed_id]); + // $url = \Illuminate\Support\Facades\URL::signedRoute('documents.public_download', ['document_hash' => $document->hash]); + + // nlog($url); -// $response = $this->withHeaders([ -// 'X-API-SECRET' => config('ninja.api_secret'), -// 'X-API-TOKEN' => $this->token, -// ])->get($url); + // $response = $this->withHeaders([ + // 'X-API-SECRET' => config('ninja.api_secret'), + // 'X-API-TOKEN' => $this->token, + // ])->get($url); -// $content = $response->streamedContent(); -// nlog($content); + // $content = $response->streamedContent(); + // nlog($content); -// $response->assertStatus(200); + // $response->assertStatus(200); -// $arr = $response->json(); + // $arr = $response->json(); -// $this->assertFalse($arr); + // $this->assertFalse($arr); -// } + // } } diff --git a/tests/Unit/DatesTest.php b/tests/Unit/DatesTest.php index 56cda7834226..3f5ca6e2d4dd 100644 --- a/tests/Unit/DatesTest.php +++ b/tests/Unit/DatesTest.php @@ -102,8 +102,9 @@ class DatesTest extends TestCase $fin_year_start = now()->createFromDate(now()->year, $first_month_of_year, 1); - if(now()->lt($fin_year_start)) + if(now()->lt($fin_year_start)) { $fin_year_start->subYear(); + } $fin_year_end = $fin_year_start->copy()->addYear()->subDay(); @@ -122,8 +123,9 @@ class DatesTest extends TestCase $fin_year_start = now()->createFromDate(now()->year, $first_month_of_year, 1); - if(now()->lt($fin_year_start)) + if(now()->lt($fin_year_start)) { $fin_year_start->subYear(); + } $fin_year_end = $fin_year_start->copy()->addYear()->subDay(); @@ -142,8 +144,9 @@ class DatesTest extends TestCase $fin_year_start = now()->createFromDate(now()->year, $first_month_of_year, 1); - if(now()->lt($fin_year_start)) + if(now()->lt($fin_year_start)) { $fin_year_start->subYear(); + } $fin_year_end = $fin_year_start->copy()->addYear()->subDay(); @@ -163,8 +166,9 @@ class DatesTest extends TestCase $fin_year_start = now()->createFromDate(now()->year, $first_month_of_year, 1); - if(now()->lt($fin_year_start)) + if(now()->lt($fin_year_start)) { $fin_year_start->subYear(); + } $fin_year_end = $fin_year_start->copy()->addYear()->subDay(); diff --git a/tests/Unit/EInvoiceTest.php b/tests/Unit/EInvoiceTest.php index 658bedba9828..7f0925d1cdff 100644 --- a/tests/Unit/EInvoiceTest.php +++ b/tests/Unit/EInvoiceTest.php @@ -9,13 +9,13 @@ * @license https://www.elastic.co/licensing/elastic-license */ -use Tests\TestCase; -use Tests\MockAccountData; use App\Jobs\Entity\CreateRawPdf; use App\Jobs\Invoice\CreateEInvoice; use horstoeko\zugferd\ZugferdDocumentReader; -use Illuminate\Routing\Middleware\ThrottleRequests; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Routing\Middleware\ThrottleRequests; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -45,29 +45,29 @@ class EInvoiceTest extends TestCase $this->assertIsString($e_invoice); } - /** - * @throws Exception - */ - public function testValidityofXMLFile() - { - $this->company->e_invoice_type = "EN16931"; - $this->invoice->client->routing_id = 'DE123456789'; - $this->invoice->client->save(); + /** + * @throws Exception + */ + public function testValidityofXMLFile() + { + $this->company->e_invoice_type = "EN16931"; + $this->invoice->client->routing_id = 'DE123456789'; + $this->invoice->client->save(); - $e_invoice = (new CreateEInvoice($this->invoice))->handle(); - $document = ZugferdDocumentReader::readAndGuessFromContent($e_invoice); - $document->getDocumentInformation($documentno, $documenttypecode, $documentdate, $documentcurrency, $taxcurrency, $taxname, $documentlangeuage, $rest); - $this->assertEquals($this->invoice->number, $documentno); - } + $e_invoice = (new CreateEInvoice($this->invoice))->handle(); + $document = ZugferdDocumentReader::readAndGuessFromContent($e_invoice); + $document->getDocumentInformation($documentno, $documenttypecode, $documentdate, $documentcurrency, $taxcurrency, $taxname, $documentlangeuage, $rest); + $this->assertEquals($this->invoice->number, $documentno); + } - /** - * @throws Exception - */ - public function checkEmbededPDFFile() - { - $pdf = (new CreateRawPdf($this->invoice->invitations()->first()))->handle(); - $document = ZugferdDocumentReader::readAndGuessFromContent($pdf); - $document->getDocumentInformation($documentno, $documenttypecode, $documentdate, $documentcurrency, $taxcurrency, $taxname, $documentlangeuage, $rest); - $this->assertEquals($this->invoice->number, $documentno); - } + /** + * @throws Exception + */ + public function checkEmbededPDFFile() + { + $pdf = (new CreateRawPdf($this->invoice->invitations()->first()))->handle(); + $document = ZugferdDocumentReader::readAndGuessFromContent($pdf); + $document->getDocumentInformation($documentno, $documenttypecode, $documentdate, $documentcurrency, $taxcurrency, $taxname, $documentlangeuage, $rest); + $this->assertEquals($this->invoice->number, $documentno); + } } diff --git a/tests/Unit/InvoiceItemTest.php b/tests/Unit/InvoiceItemTest.php index 67fa80662e5e..6b736f4005e5 100644 --- a/tests/Unit/InvoiceItemTest.php +++ b/tests/Unit/InvoiceItemTest.php @@ -11,13 +11,13 @@ namespace Tests\Unit; -use Tests\TestCase; -use Tests\MockAccountData; use App\DataMapper\InvoiceItem; use App\Factory\InvoiceFactory; use App\Factory\InvoiceItemFactory; use App\Helpers\Invoice\InvoiceItemSum; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test diff --git a/tests/Unit/InvoiceTest.php b/tests/Unit/InvoiceTest.php index 5becdabb8055..1a60d8f2ec29 100644 --- a/tests/Unit/InvoiceTest.php +++ b/tests/Unit/InvoiceTest.php @@ -11,15 +11,15 @@ namespace Tests\Unit; -use Tests\TestCase; -use App\Models\Invoice; -use Tests\MockAccountData; use App\DataMapper\InvoiceItem; use App\Factory\InvoiceFactory; use App\Factory\InvoiceItemFactory; use App\Helpers\Invoice\InvoiceSum; use App\Helpers\Invoice\InvoiceSumInclusive; +use App\Models\Invoice; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -55,7 +55,7 @@ class InvoiceTest extends TestCase { $item = InvoiceItemFactory::create(); $item->quantity = 1; - $item->cost = 50; + $item->cost = 50; $line_items[] = $item; $this->invoice->partial = 5; diff --git a/tests/Unit/LateFeeTest.php b/tests/Unit/LateFeeTest.php index b89fa0ff13d5..718592a7a19d 100644 --- a/tests/Unit/LateFeeTest.php +++ b/tests/Unit/LateFeeTest.php @@ -11,20 +11,19 @@ namespace Tests\Unit; -use Tests\TestCase; -use App\Models\User; -use App\Models\Client; +use App\DataMapper\CompanySettings; +use App\DataMapper\InvoiceItem; +use App\Factory\ClientGatewayTokenFactory; +use App\Factory\InvoiceItemFactory; +use App\Jobs\Util\ReminderJob; use App\Models\Account; +use App\Models\Client; use App\Models\Company; use App\Models\Invoice; -use Tests\MockAccountData; -use App\Jobs\Util\ReminderJob; -use App\DataMapper\InvoiceItem; -use App\DataMapper\FeesAndLimits; -use App\DataMapper\CompanySettings; -use App\Factory\InvoiceItemFactory; -use App\Factory\ClientGatewayTokenFactory; +use App\Models\User; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -134,7 +133,7 @@ class LateFeeTest extends TestCase 'discount' => 0, ]); - $i->each(function($invoice){ + $i->each(function ($invoice) { $this->assertGreaterThan(1, count($invoice->line_items)); }); @@ -153,7 +152,7 @@ class LateFeeTest extends TestCase $invoices = $i->map(function ($invoice) { - $line_items = $invoice->line_items; + $line_items = $invoice->line_items; $item = new InvoiceItem; $item->type_id = '3'; @@ -176,7 +175,7 @@ class LateFeeTest extends TestCase return $invoice; }); - $invoices = Invoice::whereIn('id', $ids)->cursor()->map(function ($invoice){ + $invoices = Invoice::whereIn('id', $ids)->cursor()->map(function ($invoice) { $this->assertGreaterThan(0, count($invoice->line_items)); $invoice->service()->removeUnpaidGatewayFees(); diff --git a/tests/Unit/PasswordTimeoutTest.php b/tests/Unit/PasswordTimeoutTest.php index fc3e13e081e1..0a899258c127 100644 --- a/tests/Unit/PasswordTimeoutTest.php +++ b/tests/Unit/PasswordTimeoutTest.php @@ -11,10 +11,10 @@ namespace Tests\Unit; -use Tests\TestCase; -use Tests\MockAccountData; -use Illuminate\Support\Facades\Cache; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Support\Facades\Cache; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test diff --git a/tests/Unit/PaymentTypeTest.php b/tests/Unit/PaymentTypeTest.php index 326e972627ad..bbe01f0175c0 100644 --- a/tests/Unit/PaymentTypeTest.php +++ b/tests/Unit/PaymentTypeTest.php @@ -11,9 +11,9 @@ namespace Tests\Unit; -use Tests\TestCase; use App\Models\PaymentType; use Illuminate\Support\Facades\Lang; +use Tests\TestCase; /** * @test @@ -32,8 +32,7 @@ class PaymentTypeTest extends TestCase { $payment_type_class = new PaymentType; - foreach($payment_type_class->type_names as $type) - { + foreach($payment_type_class->type_names as $type) { $this->assertTrue(Lang::has("texts.{$type}")); } } diff --git a/tests/Unit/RecurringDatesTest.php b/tests/Unit/RecurringDatesTest.php index e4c89c4b0415..189e2c35538b 100644 --- a/tests/Unit/RecurringDatesTest.php +++ b/tests/Unit/RecurringDatesTest.php @@ -11,21 +11,20 @@ namespace Tests\Unit; -use Tests\TestCase; -use App\Models\User; -use App\Models\Client; -use App\Models\Account; -use App\Models\Company; -use Tests\MockAccountData; -use App\Models\ClientContact; -use Illuminate\Support\Carbon; -use App\Utils\Traits\MakesHash; -use App\Models\RecurringInvoice; use App\DataMapper\CompanySettings; use App\DataMapper\DefaultSettings; use App\Factory\RecurringInvoiceFactory; -use App\Factory\InvoiceToRecurringInvoiceFactory; +use App\Models\Account; +use App\Models\Client; +use App\Models\ClientContact; +use App\Models\Company; +use App\Models\RecurringInvoice; +use App\Models\User; +use App\Utils\Traits\MakesHash; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Support\Carbon; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test @@ -100,8 +99,8 @@ class RecurringDatesTest extends TestCase ]); $recurring_invoice = RecurringInvoice::factory()->create([ - 'user_id' => $user->id, - 'company_id' => $company->id, + 'user_id' => $user->id, + 'company_id' => $company->id, 'client_id' => $client->id, 'frequency_id' => RecurringInvoice::FREQUENCY_DAILY, 'next_send_date' => now()->format('Y-m-d'), @@ -196,8 +195,8 @@ class RecurringDatesTest extends TestCase $recurring_invoice = RecurringInvoice::factory()->create([ - 'user_id' => $user->id, - 'company_id' => $company->id, + 'user_id' => $user->id, + 'company_id' => $company->id, 'client_id' => $client->id, 'frequency_id' => RecurringInvoice::FREQUENCY_DAILY, 'next_send_date' => now()->format('Y-m-d'), @@ -281,8 +280,8 @@ class RecurringDatesTest extends TestCase $recurring_invoice = RecurringInvoice::factory()->create([ - 'user_id' => $user->id, - 'company_id' => $company->id, + 'user_id' => $user->id, + 'company_id' => $company->id, 'client_id' => $client->id, 'frequency_id' => RecurringInvoice::FREQUENCY_DAILY, 'next_send_date' => now()->format('Y-m-d'), @@ -394,7 +393,7 @@ class RecurringDatesTest extends TestCase public function testDailyFrequencyCalc2() { - $account = Account::factory()->create(); + $account = Account::factory()->create(); $settings = CompanySettings::defaults(); $settings->entity_send_time = '23'; diff --git a/tests/Unit/RecurringExpenseCloneTest.php b/tests/Unit/RecurringExpenseCloneTest.php index 52487601036d..3c6d589d4297 100644 --- a/tests/Unit/RecurringExpenseCloneTest.php +++ b/tests/Unit/RecurringExpenseCloneTest.php @@ -11,14 +11,14 @@ namespace Tests\Unit; -use Tests\TestCase; -use App\Models\User; -use App\Models\Client; -use App\Models\Account; -use App\Models\Company; -use App\Utils\Traits\AppSetup; use App\Factory\RecurringExpenseFactory; use App\Factory\RecurringExpenseToExpenseFactory; +use App\Models\Account; +use App\Models\Client; +use App\Models\Company; +use App\Models\User; +use App\Utils\Traits\AppSetup; +use Tests\TestCase; /** * @test diff --git a/tests/Unit/Tax/EuTaxTest.php b/tests/Unit/Tax/EuTaxTest.php index 309d4a02933c..1c822d67e6b4 100644 --- a/tests/Unit/Tax/EuTaxTest.php +++ b/tests/Unit/Tax/EuTaxTest.php @@ -887,7 +887,7 @@ class EuTaxTest extends TestCase } - //tests with valid vat. + //tests with valid vat. public function testDeToEUWithValidVat() { $settings = CompanySettings::defaults(); diff --git a/tests/Unit/Tax/SumTaxTest.php b/tests/Unit/Tax/SumTaxTest.php index b30b3d1ca8cf..e064ffb856c9 100644 --- a/tests/Unit/Tax/SumTaxTest.php +++ b/tests/Unit/Tax/SumTaxTest.php @@ -11,23 +11,23 @@ namespace Tests\Unit\Tax; -use Tests\TestCase; +use App\DataMapper\CompanySettings; +use App\DataMapper\InvoiceItem; +use App\DataMapper\Tax\TaxData; +use App\DataMapper\Tax\TaxModel; +use App\DataMapper\Tax\ZipTax\Response; +use App\Factory\InvoiceFactory; use App\Models\Client; use App\Models\Company; use App\Models\Invoice; use App\Models\Product; -use Tests\MockAccountData; -use App\DataMapper\InvoiceItem; -use App\DataMapper\Tax\TaxData; -use App\Factory\InvoiceFactory; -use App\DataMapper\Tax\TaxModel; -use App\DataMapper\CompanySettings; -use App\DataMapper\Tax\ZipTax\Response; -use Illuminate\Routing\Middleware\ThrottleRequests; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Routing\Middleware\ThrottleRequests; +use Tests\MockAccountData; +use Tests\TestCase; /** - * @test + * @test */ class SumTaxTest extends TestCase { @@ -86,7 +86,7 @@ class SumTaxTest extends TestCase $this->makeTestData(); - $this->response = new Response($this->resp); + $this->response = new Response($this->resp); } @@ -107,7 +107,7 @@ class SumTaxTest extends TestCase 'settings' => $settings, 'tax_data' => $tax_data, 'calculate_taxes' => false, - 'origin_tax_data' => new Response($this->resp), + 'origin_tax_data' => new Response($this->resp), ]); $client = Client::factory()->create([ @@ -152,7 +152,7 @@ class SumTaxTest extends TestCase { $settings = CompanySettings::defaults(); - $settings->country_id = '840'; + $settings->country_id = '840'; $settings->currency_id = '1'; $tax_data = new TaxModel(); @@ -264,7 +264,7 @@ class SumTaxTest extends TestCase public function testSumOfTaxes() { - $sum = + $sum = $this->response->stateSalesTax + $this->response->citySalesTax + $this->response->countySalesTax + @@ -273,4 +273,4 @@ class SumTaxTest extends TestCase $this->assertEquals(0.0875, $sum); } -} \ No newline at end of file +} diff --git a/tests/Unit/Tax/TaxConfigTest.php b/tests/Unit/Tax/TaxConfigTest.php index 459c36240391..ae6cea8c7806 100644 --- a/tests/Unit/Tax/TaxConfigTest.php +++ b/tests/Unit/Tax/TaxConfigTest.php @@ -12,12 +12,12 @@ namespace Tests\Unit\Tax; use App\DataProviders\USStates; -use Tests\TestCase; use App\Models\Client; -use Tests\MockAccountData; use App\Services\Tax\Providers\TaxProvider; -use Illuminate\Routing\Middleware\ThrottleRequests; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Routing\Middleware\ThrottleRequests; +use Tests\MockAccountData; +use Tests\TestCase; /** * @test App\Services\Tax\Providers\EuTax @@ -39,8 +39,9 @@ class TaxConfigTest extends TestCase $this->makeTestData(); - if(!config('services.tax.zip_tax.key')) + if(!config('services.tax.zip_tax.key')) { $this->markTestSkipped('No API keys to test with.'); + } } public TaxProvider $tp; @@ -72,4 +73,4 @@ class TaxConfigTest extends TestCase } -} \ No newline at end of file +} diff --git a/tests/Unit/Tax/UsTaxTest.php b/tests/Unit/Tax/UsTaxTest.php index 15a0c10f1d5a..f0bbc994f514 100644 --- a/tests/Unit/Tax/UsTaxTest.php +++ b/tests/Unit/Tax/UsTaxTest.php @@ -11,21 +11,20 @@ namespace Tests\Unit\Tax; -use Tests\TestCase; +use App\DataMapper\CompanySettings; +use App\DataMapper\Tax\TaxModel; +use App\DataMapper\Tax\ZipTax\Response; use App\Models\Client; use App\Models\Company; use App\Models\Invoice; use App\Models\Product; -use Tests\MockAccountData; -use App\DataMapper\Tax\DE\Rule; -use App\DataMapper\Tax\TaxModel; -use App\DataMapper\CompanySettings; -use App\DataMapper\Tax\ZipTax\Response; -use Illuminate\Routing\Middleware\ThrottleRequests; use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Routing\Middleware\ThrottleRequests; +use Tests\MockAccountData; +use Tests\TestCase; /** - * @test + * @test */ class UsTaxTest extends TestCase { @@ -880,209 +879,209 @@ class UsTaxTest extends TestCase public function testForeignTaxesEnabledWithExemptProduct() { - $settings = CompanySettings::defaults(); - $settings->country_id = '840'; // germany + $settings = CompanySettings::defaults(); + $settings->country_id = '840'; // germany - $tax_data = new TaxModel(); - $tax_data->seller_subregion = 'CA'; - $tax_data->regions->US->has_sales_above_threshold = true; - $tax_data->regions->US->tax_all_subregions = true; - $tax_data->regions->EU->has_sales_above_threshold = true; - $tax_data->regions->EU->tax_all_subregions = true; - $tax_data->regions->EU->subregions->DE->tax_rate = 21; + $tax_data = new TaxModel(); + $tax_data->seller_subregion = 'CA'; + $tax_data->regions->US->has_sales_above_threshold = true; + $tax_data->regions->US->tax_all_subregions = true; + $tax_data->regions->EU->has_sales_above_threshold = true; + $tax_data->regions->EU->tax_all_subregions = true; + $tax_data->regions->EU->subregions->DE->tax_rate = 21; - $company = Company::factory()->create([ - 'account_id' => $this->account->id, - 'settings' => $settings, - 'tax_data' => $tax_data, - 'calculate_taxes' => true, - 'origin_tax_data' => new Response($this->mock_response), - ]); + $company = Company::factory()->create([ + 'account_id' => $this->account->id, + 'settings' => $settings, + 'tax_data' => $tax_data, + 'calculate_taxes' => true, + 'origin_tax_data' => new Response($this->mock_response), + ]); - $client = Client::factory()->create([ - 'user_id' => $this->user->id, - 'company_id' => $company->id, - 'country_id' => 276, - 'shipping_country_id' => 276, - 'has_valid_vat_number' => false, - 'postal_code' => 'xx', - 'is_tax_exempt' => false, - ]); + $client = Client::factory()->create([ + 'user_id' => $this->user->id, + 'company_id' => $company->id, + 'country_id' => 276, + 'shipping_country_id' => 276, + 'has_valid_vat_number' => false, + 'postal_code' => 'xx', + 'is_tax_exempt' => false, + ]); - $invoice = Invoice::factory()->create([ - 'company_id' => $company->id, - 'client_id' => $client->id, - 'status_id' => 1, - 'user_id' => $this->user->id, - 'uses_inclusive_taxes' => false, - 'discount' => 0, - 'line_items' => [ - [ - 'product_key' => 'Test', - 'notes' => 'Test', - 'cost' => 100, - 'quantity' => 1, - 'tax_name1' => '', - 'tax_rate1' => 0, - 'tax_name2' => '', - 'tax_rate2' => 0, - 'tax_name3' => '', - 'tax_rate3' => 0, - 'type_id' => '1', - 'tax_id' => Product::PRODUCT_TYPE_EXEMPT, - ], + $invoice = Invoice::factory()->create([ + 'company_id' => $company->id, + 'client_id' => $client->id, + 'status_id' => 1, + 'user_id' => $this->user->id, + 'uses_inclusive_taxes' => false, + 'discount' => 0, + 'line_items' => [ + [ + 'product_key' => 'Test', + 'notes' => 'Test', + 'cost' => 100, + 'quantity' => 1, + 'tax_name1' => '', + 'tax_rate1' => 0, + 'tax_name2' => '', + 'tax_rate2' => 0, + 'tax_name3' => '', + 'tax_rate3' => 0, + 'type_id' => '1', + 'tax_id' => Product::PRODUCT_TYPE_EXEMPT, ], - 'tax_rate1' => 0, - 'tax_rate2' => 0, - 'tax_rate3' => 0, - 'tax_name1' => '', - 'tax_name2' => '', - 'tax_name3' => '', - 'tax_data' => new Response($this->mock_response), - ]); + ], + 'tax_rate1' => 0, + 'tax_rate2' => 0, + 'tax_rate3' => 0, + 'tax_name1' => '', + 'tax_name2' => '', + 'tax_name3' => '', + 'tax_data' => new Response($this->mock_response), + ]); - $invoice = $invoice->calc()->getInvoice()->service()->markSent()->save(); + $invoice = $invoice->calc()->getInvoice()->service()->markSent()->save(); - $this->assertEquals(100, $invoice->amount); + $this->assertEquals(100, $invoice->amount); } public function testForeignTaxesDisabled() { - $settings = CompanySettings::defaults(); - $settings->country_id = '840'; // germany + $settings = CompanySettings::defaults(); + $settings->country_id = '840'; // germany - $tax_data = new TaxModel(); - $tax_data->seller_subregion = 'CA'; - $tax_data->regions->US->has_sales_above_threshold = true; - $tax_data->regions->US->tax_all_subregions = true; - $tax_data->regions->EU->has_sales_above_threshold = true; - $tax_data->regions->EU->tax_all_subregions = false; - $tax_data->regions->EU->subregions->DE->tax_rate = 21; + $tax_data = new TaxModel(); + $tax_data->seller_subregion = 'CA'; + $tax_data->regions->US->has_sales_above_threshold = true; + $tax_data->regions->US->tax_all_subregions = true; + $tax_data->regions->EU->has_sales_above_threshold = true; + $tax_data->regions->EU->tax_all_subregions = false; + $tax_data->regions->EU->subregions->DE->tax_rate = 21; - $company = Company::factory()->create([ - 'account_id' => $this->account->id, - 'settings' => $settings, - 'tax_data' => $tax_data, - 'calculate_taxes' => true, - 'origin_tax_data' => new Response($this->mock_response), - ]); + $company = Company::factory()->create([ + 'account_id' => $this->account->id, + 'settings' => $settings, + 'tax_data' => $tax_data, + 'calculate_taxes' => true, + 'origin_tax_data' => new Response($this->mock_response), + ]); - $client = Client::factory()->create([ - 'user_id' => $this->user->id, - 'company_id' => $company->id, - 'country_id' => 276, - 'shipping_country_id' => 276, - 'has_valid_vat_number' => false, - 'postal_code' => 'xx', - ]); + $client = Client::factory()->create([ + 'user_id' => $this->user->id, + 'company_id' => $company->id, + 'country_id' => 276, + 'shipping_country_id' => 276, + 'has_valid_vat_number' => false, + 'postal_code' => 'xx', + ]); - $invoice = Invoice::factory()->create([ - 'company_id' => $company->id, - 'client_id' => $client->id, - 'status_id' => 1, - 'user_id' => $this->user->id, - 'uses_inclusive_taxes' => false, - 'discount' => 0, - 'line_items' => [ - [ - 'product_key' => 'Test', - 'notes' => 'Test', - 'cost' => 100, - 'quantity' => 1, - 'tax_name1' => '', - 'tax_rate1' => 0, - 'tax_name2' => '', - 'tax_rate2' => 0, - 'tax_name3' => '', - 'tax_rate3' => 0, - 'type_id' => '1', - 'tax_id' => Product::PRODUCT_TYPE_PHYSICAL, - ], + $invoice = Invoice::factory()->create([ + 'company_id' => $company->id, + 'client_id' => $client->id, + 'status_id' => 1, + 'user_id' => $this->user->id, + 'uses_inclusive_taxes' => false, + 'discount' => 0, + 'line_items' => [ + [ + 'product_key' => 'Test', + 'notes' => 'Test', + 'cost' => 100, + 'quantity' => 1, + 'tax_name1' => '', + 'tax_rate1' => 0, + 'tax_name2' => '', + 'tax_rate2' => 0, + 'tax_name3' => '', + 'tax_rate3' => 0, + 'type_id' => '1', + 'tax_id' => Product::PRODUCT_TYPE_PHYSICAL, ], - 'tax_rate1' => 0, - 'tax_rate2' => 0, - 'tax_rate3' => 0, - 'tax_name1' => '', - 'tax_name2' => '', - 'tax_name3' => '', - 'tax_data' => new Response($this->mock_response), - ]); + ], + 'tax_rate1' => 0, + 'tax_rate2' => 0, + 'tax_rate3' => 0, + 'tax_name1' => '', + 'tax_name2' => '', + 'tax_name3' => '', + 'tax_data' => new Response($this->mock_response), + ]); - $invoice = $invoice->calc()->getInvoice()->service()->markSent()->save(); + $invoice = $invoice->calc()->getInvoice()->service()->markSent()->save(); - $this->assertEquals(100, $invoice->amount); + $this->assertEquals(100, $invoice->amount); } public function testForeignTaxesEnabled() { - $settings = CompanySettings::defaults(); - $settings->country_id = '840'; // germany + $settings = CompanySettings::defaults(); + $settings->country_id = '840'; // germany - $tax_data = new TaxModel(); - $tax_data->seller_subregion = 'CA'; - $tax_data->regions->US->has_sales_above_threshold = true; - $tax_data->regions->US->tax_all_subregions = true; - $tax_data->regions->EU->has_sales_above_threshold = true; - $tax_data->regions->EU->tax_all_subregions = true; - $tax_data->regions->EU->subregions->DE->tax_rate = 21; + $tax_data = new TaxModel(); + $tax_data->seller_subregion = 'CA'; + $tax_data->regions->US->has_sales_above_threshold = true; + $tax_data->regions->US->tax_all_subregions = true; + $tax_data->regions->EU->has_sales_above_threshold = true; + $tax_data->regions->EU->tax_all_subregions = true; + $tax_data->regions->EU->subregions->DE->tax_rate = 21; - $company = Company::factory()->create([ - 'account_id' => $this->account->id, - 'settings' => $settings, - 'tax_data' => $tax_data, - 'calculate_taxes' => true, - 'origin_tax_data' => new Response($this->mock_response), - ]); + $company = Company::factory()->create([ + 'account_id' => $this->account->id, + 'settings' => $settings, + 'tax_data' => $tax_data, + 'calculate_taxes' => true, + 'origin_tax_data' => new Response($this->mock_response), + ]); - $client = Client::factory()->create([ - 'user_id' => $this->user->id, - 'company_id' => $company->id, - 'country_id' => 276, - 'shipping_country_id' => 276, - 'has_valid_vat_number' => false, - 'postal_code' => 'xx', - 'tax_data' => new Response($this->mock_response), - ]); + $client = Client::factory()->create([ + 'user_id' => $this->user->id, + 'company_id' => $company->id, + 'country_id' => 276, + 'shipping_country_id' => 276, + 'has_valid_vat_number' => false, + 'postal_code' => 'xx', + 'tax_data' => new Response($this->mock_response), + ]); - $invoice = Invoice::factory()->create([ - 'company_id' => $company->id, - 'client_id' => $client->id, - 'status_id' => 1, - 'user_id' => $this->user->id, - 'uses_inclusive_taxes' => false, - 'discount' => 0, - 'line_items' => [ - [ - 'product_key' => 'Test', - 'notes' => 'Test', - 'cost' => 100, - 'quantity' => 1, - 'tax_name1' => '', - 'tax_rate1' => 0, - 'tax_name2' => '', - 'tax_rate2' => 0, - 'tax_name3' => '', - 'tax_rate3' => 0, - 'type_id' => '1', - 'tax_id' => Product::PRODUCT_TYPE_PHYSICAL, - ], + $invoice = Invoice::factory()->create([ + 'company_id' => $company->id, + 'client_id' => $client->id, + 'status_id' => 1, + 'user_id' => $this->user->id, + 'uses_inclusive_taxes' => false, + 'discount' => 0, + 'line_items' => [ + [ + 'product_key' => 'Test', + 'notes' => 'Test', + 'cost' => 100, + 'quantity' => 1, + 'tax_name1' => '', + 'tax_rate1' => 0, + 'tax_name2' => '', + 'tax_rate2' => 0, + 'tax_name3' => '', + 'tax_rate3' => 0, + 'type_id' => '1', + 'tax_id' => Product::PRODUCT_TYPE_PHYSICAL, ], - 'tax_rate1' => 0, - 'tax_rate2' => 0, - 'tax_rate3' => 0, - 'tax_name1' => '', - 'tax_name2' => '', - 'tax_name3' => '', - 'tax_data' => new Response($this->mock_response), - ]); + ], + 'tax_rate1' => 0, + 'tax_rate2' => 0, + 'tax_rate3' => 0, + 'tax_name1' => '', + 'tax_name2' => '', + 'tax_name3' => '', + 'tax_data' => new Response($this->mock_response), + ]); - $invoice = $invoice->calc()->getInvoice()->service()->markSent()->save(); + $invoice = $invoice->calc()->getInvoice()->service()->markSent()->save(); - $this->assertEquals(121, $invoice->amount); + $this->assertEquals(121, $invoice->amount); } From 572451df13c009bd07502a2e5dbaea0e8ad25282 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 26 Nov 2023 20:05:17 +1100 Subject: [PATCH 3/7] Minor fixes --- app/Jobs/Payment/EmailPayment.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Jobs/Payment/EmailPayment.php b/app/Jobs/Payment/EmailPayment.php index 455b4161ca35..96734aa20ba8 100644 --- a/app/Jobs/Payment/EmailPayment.php +++ b/app/Jobs/Payment/EmailPayment.php @@ -72,7 +72,7 @@ class EmailPayment implements ShouldQueue $email_builder = (new PaymentEmailEngine($this->payment, $this->contact))->build(); - if($this->settings->payment_email_all_contacts && $this->payment->invoices && $this->payment->invoices->count() >= 1) { + if($this->payment->client->getSetting('payment_email_all_contacts') && $this->payment->invoices && $this->payment->invoices->count() >= 1) { $this->emailAllContacts($email_builder); return; } From dfc2f9ffe2dbf36aad7ba690b16d3493ae3ba176 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 26 Nov 2023 20:45:40 +1100 Subject: [PATCH 4/7] Fixes for search --- app/Http/Controllers/SearchController.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php index a32c9fdf6ec0..10ca2a6b25bd 100644 --- a/app/Http/Controllers/SearchController.php +++ b/app/Http/Controllers/SearchController.php @@ -65,12 +65,10 @@ class SearchController extends Controller $client->contacts->each(function ($contact) { $this->client_contacts[] = [ 'name' => $contact->present()->search_display(), - 'type' => '/client_contact', - 'id' => $contact->hashed_id, - 'path' => "/clients/{$contact->hashed_id}" - ]; - - + 'type' => '/client', + 'id' => $contact->client->hashed_id, + 'path' => "/clients/{$contact->client->hashed_id}" + ]; }); } From b2b8494971a3392f5628699880715c461ed7aca9 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 27 Nov 2023 21:26:56 +1100 Subject: [PATCH 5/7] Add columns for tasks --- app/Filters/TaskFilters.php | 10 +++++++ app/Http/Requests/Task/StoreTaskRequest.php | 2 ++ app/Http/Requests/Task/UpdateTaskRequest.php | 2 ++ app/Models/Task.php | 11 ++++++++ app/Models/TaskStatus.php | 1 + ...d_hash_and_meta_columns_to_tasks_table.php | 26 +++++++++++++++++++ 6 files changed, 52 insertions(+) create mode 100644 database/migrations/2023_11_27_095042_add_hash_and_meta_columns_to_tasks_table.php diff --git a/app/Filters/TaskFilters.php b/app/Filters/TaskFilters.php index 53cc0f01583c..37f99eaffebd 100644 --- a/app/Filters/TaskFilters.php +++ b/app/Filters/TaskFilters.php @@ -97,6 +97,16 @@ class TaskFilters extends QueryFilters return $this->builder->where('project_id', $this->decodePrimaryKey($project)); } + public function hash(string $hash = ''): Builder + { + if (strlen($hash) == 0) { + return $this->builder; + } + + return $this->builder->where('hash', $hash); + + } + public function number(string $number = ''): Builder { if (strlen($number) == 0) { diff --git a/app/Http/Requests/Task/StoreTaskRequest.php b/app/Http/Requests/Task/StoreTaskRequest.php index 12d61e9441cf..236a27051ae0 100644 --- a/app/Http/Requests/Task/StoreTaskRequest.php +++ b/app/Http/Requests/Task/StoreTaskRequest.php @@ -54,6 +54,8 @@ class StoreTaskRequest extends Request $rules['project_id'] = 'bail|required|exists:projects,id,company_id,'.$user->company()->id.',is_deleted,0'; } + $rules['hash'] = 'bail|sometimes|string|nullable'; + $rules['time_log'] = ['bail',function ($attribute, $values, $fail) { if(is_string($values)) { diff --git a/app/Http/Requests/Task/UpdateTaskRequest.php b/app/Http/Requests/Task/UpdateTaskRequest.php index 85b8254dd75a..87d2fa7d4d24 100644 --- a/app/Http/Requests/Task/UpdateTaskRequest.php +++ b/app/Http/Requests/Task/UpdateTaskRequest.php @@ -60,6 +60,8 @@ class UpdateTaskRequest extends Request $rules['project_id'] = 'bail|required|exists:projects,id,company_id,'.$user->company()->id.',is_deleted,0'; } + $rules['hash'] = 'bail|sometimes|string|nullable'; + $rules['time_log'] = ['bail', function ($attribute, $values, $fail) { if(is_string($values)) { diff --git a/app/Models/Task.php b/app/Models/Task.php index 368eae40d55b..fbb1954757a4 100644 --- a/app/Models/Task.php +++ b/app/Models/Task.php @@ -19,6 +19,8 @@ use Illuminate\Support\Carbon; * App\Models\Task * * @property int $id + * @property string|null $hash + * @property object|null $meta * @property int $user_id * @property int|null $assigned_user_id * @property int $company_id @@ -118,6 +120,15 @@ class Task extends BaseModel 'number', 'is_date_based', 'status_order', + 'hash', + 'meta', + ]; + + protected $casts = [ + 'meta' => 'object', + 'updated_at' => 'timestamp', + 'created_at' => 'timestamp', + 'deleted_at' => 'timestamp', ]; protected $touches = []; diff --git a/app/Models/TaskStatus.php b/app/Models/TaskStatus.php index 8a943af50325..03b3c06c22dc 100644 --- a/app/Models/TaskStatus.php +++ b/app/Models/TaskStatus.php @@ -71,4 +71,5 @@ class TaskStatus extends BaseModel 'color', 'status_order', ]; + } diff --git a/database/migrations/2023_11_27_095042_add_hash_and_meta_columns_to_tasks_table.php b/database/migrations/2023_11_27_095042_add_hash_and_meta_columns_to_tasks_table.php new file mode 100644 index 000000000000..67503fe7ab3e --- /dev/null +++ b/database/migrations/2023_11_27_095042_add_hash_and_meta_columns_to_tasks_table.php @@ -0,0 +1,26 @@ +string('hash')->nullable()->index(); + $table->text('meta')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + } +}; From dc39d7f01a69258454a8998e784c15721b17f5ff Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 27 Nov 2023 22:20:58 +1100 Subject: [PATCH 6/7] minor fixes for formatting --- app/Http/Controllers/BaseController.php | 6 +++- app/Mail/Engine/PaymentEmailEngine.php | 3 ++ app/Services/Pdf/PdfMock.php | 34 +++++++++++++++++++++++ app/Services/Template/TemplateMock.php | 6 ++-- app/Services/Template/TemplateService.php | 19 ++++++++++++- app/Utils/HtmlEngine.php | 6 ++++ app/Utils/PaymentHtmlEngine.php | 18 ++++++++++-- lang/en/texts.php | 3 +- 8 files changed, 86 insertions(+), 9 deletions(-) diff --git a/app/Http/Controllers/BaseController.php b/app/Http/Controllers/BaseController.php index f63c33cdd22f..b4fe782fd875 100644 --- a/app/Http/Controllers/BaseController.php +++ b/app/Http/Controllers/BaseController.php @@ -928,7 +928,11 @@ class BaseController extends Controller } //allows us to selective display bank integrations back to the user if they can view / create bank transactions but without the bank balance being present in the response elseif($this->entity_type == TaxRate::class && $user->hasIntersectPermissions(['create_invoice','edit_invoice','create_quote','edit_quote','create_purchase_order','edit_purchase_order'])) { // need to show tax rates if the user has the ability to create documents. - } else { + } + elseif($this->entity_type == ExpenseCategory::class && $user->hasPermission('create_expense')) { + // need to show expense categories if the user has the ability to create expenses. + } + else { $query->where('user_id', '=', $user->id); } } elseif (in_array($this->entity_type, [Design::class, GroupSetting::class, PaymentTerm::class, TaskStatus::class])) { diff --git a/app/Mail/Engine/PaymentEmailEngine.php b/app/Mail/Engine/PaymentEmailEngine.php index 39f3fe9afc72..7a609be911dd 100644 --- a/app/Mail/Engine/PaymentEmailEngine.php +++ b/app/Mail/Engine/PaymentEmailEngine.php @@ -197,6 +197,8 @@ class PaymentEmailEngine extends BaseEmailEngine $data = []; $data['$from'] = ['value' => '', 'label' => ctrans('texts.from')]; + $data['$amount_paid'] = ['value' => '', 'label' => ctrans('texts.amount_paid')]; + $data['$refund'] = ['value' => '', 'label' => ctrans('texts.refund')]; $data['$to'] = ['value' => '', 'label' => ctrans('texts.to')]; $data['$number'] = ['value' => $this->payment->number ?: ' ', 'label' => ctrans('texts.payment_number')]; $data['$payment.number'] = &$data['$number']; @@ -207,6 +209,7 @@ class PaymentEmailEngine extends BaseEmailEngine $data['$amount'] = &$data['$payment.amount']; $data['$payment.date'] = ['value' => $this->translateDate($this->payment->date, $this->client->date_format(), $this->client->locale()), 'label' => ctrans('texts.payment_date')]; $data['$transaction_reference'] = ['value' => $this->payment->transaction_reference, 'label' => ctrans('texts.transaction_reference')]; + $data['$reference'] = ['value' => '', 'label' => ctrans('texts.reference')]; $data['$public_notes'] = ['value' => $this->payment->public_notes, 'label' => ctrans('texts.notes')]; $data['$payment1'] = ['value' => $this->helpers->formatCustomFieldValue($this->company->custom_fields, 'payment1', $this->payment->custom_value1, $this->client) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'payment1')]; diff --git a/app/Services/Pdf/PdfMock.php b/app/Services/Pdf/PdfMock.php index 83ff27e40938..cebf46dc271b 100644 --- a/app/Services/Pdf/PdfMock.php +++ b/app/Services/Pdf/PdfMock.php @@ -432,6 +432,8 @@ class PdfMock '$credit_no' => '0029', '$font_size' => $this->settings->font_size, '$view_link' => 'View Invoice', + '$reference' => '', + '$po_number' => 'PO12345', '$page_size' => $this->settings->page_size, '$country_2' => 'AF', '$firstName' => 'Benedict', @@ -464,6 +466,7 @@ class PdfMock '$client4' => 'custom value', '$dueDate' => '2022-01-01', '$invoice' => '0029', + '$invoices' => '0029', '$account' => '434343', '$country' => 'United States', '$contact' => 'Benedict Eichmann', @@ -501,6 +504,13 @@ class PdfMock '$show_shipping_address_visibility' => $this->settings->show_shipping_address ? 'visible' : 'hidden', '$start_date' => '31/01/2023', '$end_date' => '31/12/2023', + '$history' => '', + '$amount_paid' => '', + '$receipt' => '', + '$ship_to' => '', + '$delivery_note' => '', + '$quantity' => '', + '$order_number' => '', ], 'labels' => $this->mockTranslatedLabels(), ]; @@ -751,6 +761,7 @@ class PdfMock '$user_iban_label' => ctrans('texts.iban'), '$signature_label' => ctrans('texts.signature'), '$font_size_label' => ctrans('texts.font_size'), + '$reference_label' => ctrans('texts.reference'), '$po_number_label' => ctrans('texts.po_number'), '$page_size_label' => ctrans('texts.page_size'), '$user.name_label' => ctrans('texts.name'), @@ -821,6 +832,15 @@ class PdfMock '$to_label' => ctrans('texts.to'), '$start_date_label' => ctrans('texts.start_date'), '$end_date_label' => ctrans('texts.end_date'), + '$invoice_label' => ctrans('texts.invoice'), + '$invoices_label' => ctrans('texts.invoices'), + '$history_label' => ctrans('texts.history'), + '$amount_paid_label' => ctrans('texts.amount_paid'), + '$receipt_label' => ctrans('texts.receipt'), + '$ship_to_label' => ctrans('texts.ship_to'), + '$delivery_note_label' => ctrans('texts.delivery_note'), + '$quantity_label' => ctrans('texts.quantity'), + '$order_number_label' => ctrans('texts.order_number'), ]; } @@ -1018,6 +1038,7 @@ class PdfMock '$amount_raw' => '10256.40', '$vat_number' => 'At qui autem iusto et.', '$portal_url' => 'http://ninja.test:8000/vendor/', + '$reference' => '', '$po_number' => null, '$statement' => '', '$view_link' => ' @@ -1133,6 +1154,12 @@ class PdfMock '$dir' => 'ltr', '$net' => 'Net', '$to' => '', + '$amount_paid' => '', + '$receipt' => '', + '$ship_to' => '', + '$delivery_note_label' => '', + '$quantity_label' => '', + '$order_number_label' => '', ], 'labels' => $this->vendorLabels(), ]; @@ -1286,6 +1313,7 @@ class PdfMock '$amount_raw_label' => ctrans('texts.amount'), '$vat_number_label' => ctrans('texts.vat_number'), '$portal_url_label' => ctrans('texts.link'), + '$reference_label' => ctrans('texts.reference'), '$po_number_label' => ctrans('texts.po_number'), '$statement_label' => ctrans('texts.statement'), '$view_link_label' => ctrans('texts.link'), @@ -1355,6 +1383,12 @@ class PdfMock '$net_label' => ctrans('texts.net'), '$dir_label' => '', '$to_label' => ctrans('texts.to'), + '$amount_paid_label' => ctrans('texts.amount_paid'), + '$receipt_label' => ctrans('texts.receipt'), + '$ship_to_label' => ctrans('texts.ship_to'), + '$delivery_note_label' => ctrans('texts.delivery_note'), + '$quantity_label' => ctrans('texts.quantity'), + '$order_number_label' => ctrans('texts.order_number'), ]; } } diff --git a/app/Services/Template/TemplateMock.php b/app/Services/Template/TemplateMock.php index 45168af1a928..e8c3907cfac2 100644 --- a/app/Services/Template/TemplateMock.php +++ b/app/Services/Template/TemplateMock.php @@ -23,14 +23,14 @@ class TemplateMock public string $credit_data = '[{"id":"mWZdPwbKgR","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","vendor_id":"","amount":881.03,"balance":548.03,"client_id":"QJ0dN6dLOv","status_id":"3","design_id":"Wpmbk5ezJn","created_at":1695796650,"updated_at":1695799160,"archived_at":0,"is_deleted":false,"number":"0001","discount":2,"po_number":"Quisquam.","date":"2023-06-30","last_sent_date":"","next_send_date":"","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","due_date":"2007-03-30","terms":"Voluptatem et aliquid enim dolorem rerum voluptatem. Doloremque magni nesciunt unde nobis omnis quas. Aut totam adipisci voluptatum explicabo qui fugit assumenda. Soluta architecto sit exercitationem amet doloribus ad vel qui. Eos porro qui voluptatum sint. Consequatur voluptatem eveniet vitae illo ea. Rem enim sit impedit odit.","public_notes":"","private_notes":"","uses_inclusive_taxes":false,"tax_name1":"GST","tax_rate1":10,"tax_name2":"VAT","tax_rate2":17.5,"tax_name3":"","tax_rate3":0,"total_taxes":190.03,"is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","has_tasks":false,"has_expenses":false,"custom_surcharge1":0,"custom_surcharge2":0,"custom_surcharge3":0,"custom_surcharge4":0,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"quantity":1,"cost":693,"product_key":"Sed.","notes":"Est sequi.","discount":0,"is_amount_discount":true,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":693,"gross_line_total":693,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"56","custom_value3":"Dolores porro quia.","custom_value4":"Perferendis itaque.","type_id":"1","product_cost":0,"tax_amount":0,"date":"","tax_id":"","task_id":"","expense_id":""}],"entity_type":"credit","exchange_rate":1,"paid_to_date":333,"subscription_id":"","client":{"id":"QJ0dN6dLOv","user_id":"wMvbmOeYAl","assigned_user_id":"","name":"Paucek and Sons","website":"http:\/\/www.wiegand.com\/sit-repellendus-enim-porro-aut-voluptas-voluptates.html","private_notes":"In nihil non voluptas voluptatibus molestiae et. Nihil labore eligendi omnis id. Et cumque reiciendis blanditiis fugiat.","balance":19958.86,"group_settings_id":"","paid_to_date":18895.75,"payment_balance":0,"credit_balance":573.53,"last_login":0,"size_id":"","public_notes":"","client_hash":"ngQe8O6SInYp1D0SKacHE8f6nzr3Gc1UkkoyGMKI","address1":"873","address2":"220 Hand Glen","phone":"","city":"Lake Kallie","state":"Ohio","postal_code":"77890","country_id":"535","industry_id":"","custom_value1":"1974-10-02 21:56:55","custom_value2":"Aqua","custom_value3":"modi","custom_value4":"xhomenick@hotmail.com","shipping_address1":"89064","shipping_address2":"87854 Meda Junction","shipping_city":"South Aryanna","shipping_state":"Connecticut","shipping_postal_code":"52527-1873","shipping_country_id":"4","settings":{"entity":"App\\Models\\Client","industry_id":"","size_id":"","currency_id":"1"},"is_deleted":false,"vat_number":"881403416","id_number":"MU19IWUA7340242407223765691CMM","updated_at":1695811138,"archived_at":0,"created_at":1695796650,"display_name":"Paucek and Sons","number":"0005","has_valid_vat_number":false,"is_tax_exempt":false,"routing_id":"","tax_info":{},"contacts":[{"id":"yMYerkEaOB","first_name":"Bret","last_name":"Beatty","email":"user@example.com","created_at":1695796650,"updated_at":1695796650,"archived_at":0,"is_primary":true,"is_locked":false,"phone":"1-985-403-1242","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","contact_key":"juMXBqyvDashDUvoYXsdcbZV2SRrFf0BOUFjsc6G","send_email":true,"last_login":0,"password":"**********","link":"http:\/\/ninja.test:8000\/client\/key_login\/juMXBqyvDashDUvoYXsdcbZV2SRrFf0BOUFjsc6G"},{"id":"gl9av2maG1","first_name":"Sandra","last_name":"Daniel","email":"linnie.aufderhar@example.net","created_at":1695796650,"updated_at":1695796650,"archived_at":0,"is_primary":false,"is_locked":false,"phone":"+17319151379","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","contact_key":"sm53aNvvsGUmLXFku0RLPUrP0zLj3rzBcTaGMjHd","send_email":true,"last_login":0,"password":"**********","link":"http:\/\/ninja.test:8000\/client\/key_login\/sm53aNvvsGUmLXFku0RLPUrP0zLj3rzBcTaGMjHd"},{"id":"7LDdwpRe1Y","first_name":"Leone","last_name":"Bode","email":"ipollich@example.org","created_at":1695796650,"updated_at":1695796650,"archived_at":0,"is_primary":false,"is_locked":false,"phone":"(424) 789-3412","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","contact_key":"gDUwiOqRehgCHWbbctW8qgKiLmma3xvsZi10a5Ma","send_email":true,"last_login":0,"password":"**********","link":"http:\/\/ninja.test:8000\/client\/key_login\/gDUwiOqRehgCHWbbctW8qgKiLmma3xvsZi10a5Ma"}],"documents":{"data":[]},"gateway_tokens":{"data":[]}}},{"id":"Oy5eVOMaEP","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","vendor_id":"","amount":25.5,"balance":25.5,"client_id":"QJ0dN6dLOv","status_id":"2","design_id":"Wpmbk5ezJn","created_at":1695811134,"updated_at":1695811138,"archived_at":0,"is_deleted":false,"number":"0009","discount":2,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","due_date":"","terms":"

Voluptatem et aliquid enim dolorem rerum voluptatem. Doloremque magni nesciunt unde nobis omnis quas. Aut totam adipisci voluptatum explicabo qui fugit assumenda. Soluta architecto sit exercitationem amet doloribus ad vel qui. Eos porro qui voluptatum sint. Consequatur voluptatem eveniet vitae illo ea. Rem enim sit impedit odit.<\/p>","public_notes":"","private_notes":"","uses_inclusive_taxes":false,"tax_name1":"GST","tax_rate1":10,"tax_name2":"VAT","tax_rate2":17.5,"tax_name3":"","tax_rate3":0,"total_taxes":5.5,"is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","has_tasks":false,"has_expenses":false,"custom_surcharge1":0,"custom_surcharge2":0,"custom_surcharge3":0,"custom_surcharge4":0,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"quantity":1,"cost":22,"product_key":"Sed.","notes":"Est sequi.","discount":0,"is_amount_discount":true,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":"0","line_total":22,"gross_line_total":22,"custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"56","custom_value3":"Dolores porro quia.","custom_value4":"Perferendis itaque.","type_id":"1","product_cost":0,"tax_amount":0,"date":"","tax_id":"1","task_id":"","expense_id":"","_id":"ab67ad52-725e-4106-b80b-1eabe84ca90a"}],"entity_type":"credit","exchange_rate":1,"paid_to_date":0,"subscription_id":"","client":{"id":"QJ0dN6dLOv","user_id":"wMvbmOeYAl","assigned_user_id":"","name":"Paucek and Sons","website":"http:\/\/www.wiegand.com\/sit-repellendus-enim-porro-aut-voluptas-voluptates.html","private_notes":"In nihil non voluptas voluptatibus molestiae et. Nihil labore eligendi omnis id. Et cumque reiciendis blanditiis fugiat.","balance":19958.86,"group_settings_id":"","paid_to_date":18895.75,"payment_balance":0,"credit_balance":573.53,"last_login":0,"size_id":"","public_notes":"","client_hash":"ngQe8O6SInYp1D0SKacHE8f6nzr3Gc1UkkoyGMKI","address1":"873","address2":"220 Hand Glen","phone":"","city":"Lake Kallie","state":"Ohio","postal_code":"77890","country_id":"535","industry_id":"","custom_value1":"1974-10-02 21:56:55","custom_value2":"Aqua","custom_value3":"modi","custom_value4":"xhomenick@hotmail.com","shipping_address1":"89064","shipping_address2":"87854 Meda Junction","shipping_city":"South Aryanna","shipping_state":"Connecticut","shipping_postal_code":"52527-1873","shipping_country_id":"4","settings":{"entity":"App\\Models\\Client","industry_id":"","size_id":"","currency_id":"1"},"is_deleted":false,"vat_number":"881403416","id_number":"MU19IWUA7340242407223765691CMM","updated_at":1695811138,"archived_at":0,"created_at":1695796650,"display_name":"Paucek and Sons","number":"0005","has_valid_vat_number":false,"is_tax_exempt":false,"routing_id":"","tax_info":{},"contacts":[{"id":"yMYerkEaOB","first_name":"Bret","last_name":"Beatty","email":"user@example.com","created_at":1695796650,"updated_at":1695796650,"archived_at":0,"is_primary":true,"is_locked":false,"phone":"1-985-403-1242","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","contact_key":"juMXBqyvDashDUvoYXsdcbZV2SRrFf0BOUFjsc6G","send_email":true,"last_login":0,"password":"**********","link":"http:\/\/ninja.test:8000\/client\/key_login\/juMXBqyvDashDUvoYXsdcbZV2SRrFf0BOUFjsc6G"},{"id":"gl9av2maG1","first_name":"Sandra","last_name":"Daniel","email":"linnie.aufderhar@example.net","created_at":1695796650,"updated_at":1695796650,"archived_at":0,"is_primary":false,"is_locked":false,"phone":"+17319151379","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","contact_key":"sm53aNvvsGUmLXFku0RLPUrP0zLj3rzBcTaGMjHd","send_email":true,"last_login":0,"password":"**********","link":"http:\/\/ninja.test:8000\/client\/key_login\/sm53aNvvsGUmLXFku0RLPUrP0zLj3rzBcTaGMjHd"},{"id":"7LDdwpRe1Y","first_name":"Leone","last_name":"Bode","email":"ipollich@example.org","created_at":1695796650,"updated_at":1695796650,"archived_at":0,"is_primary":false,"is_locked":false,"phone":"(424) 789-3412","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","contact_key":"gDUwiOqRehgCHWbbctW8qgKiLmma3xvsZi10a5Ma","send_email":true,"last_login":0,"password":"**********","link":"http:\/\/ninja.test:8000\/client\/key_login\/gDUwiOqRehgCHWbbctW8qgKiLmma3xvsZi10a5Ma"}],"documents":{"data":[]},"gateway_tokens":{"data":[]}}}]'; - public string $payment_data = '[{"status":"Refunded","badge":"

Refunded<\/span><\/h6>","amount":"$6,077.51","applied":"$6,077.51","balance":"-$6,077.51","refunded":"$6,077.51","amount_raw":"6077.510000","applied_raw":"6077.510000","refunded_raw":"6077.510000","balance_raw":-6077.51,"date":"30\/Sep\/2023","method":"EuroCard","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"cypress","balance":"0.000000","payment_balance":"0.000000","credit_balance":"11661.820000"},"paymentables":[{"invoice":"0019","amount_raw":"6077.5100","refunded_raw":"6077.5100","net_raw":0,"amount":"$6,077.51","refunded":"$6,077.51","net":"$0.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]},{"status":"Refunded","badge":"
Refunded<\/span><\/h6>","amount":"$4,090.64","applied":"$4,090.64","balance":"-$4,090.64","refunded":"$4,090.64","amount_raw":"4090.640000","applied_raw":"4090.640000","refunded_raw":"4090.640000","balance_raw":-4090.64,"date":"30\/Sep\/2023","method":"Discover Card","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0002","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"cypress","balance":"0.000000","payment_balance":"0.000000","credit_balance":"11661.820000"},"paymentables":[{"invoice":"0020","amount_raw":"4090.6400","refunded_raw":"4090.6400","net_raw":0,"amount":"$4,090.64","refunded":"$4,090.64","net":"$0.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]},{"status":"Refunded","badge":"
Refunded<\/span><\/h6>","amount":"$2,197.26","applied":"$2,197.26","balance":"-$2,197.26","refunded":"$2,197.26","amount_raw":"2197.260000","applied_raw":"2197.260000","refunded_raw":"2197.260000","balance_raw":-2197.26,"date":"30\/Sep\/2023","method":"Diners Card","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0003","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000"},"paymentables":[{"invoice":"0021","amount_raw":"2197.2600","refunded_raw":"2197.2600","net_raw":0,"amount":"$2,197.26","refunded":"$2,197.26","net":"$0.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]},{"status":"Partially Refunded","badge":"
Partially Refunded<\/span><\/h6>","amount":"$4,955.50","applied":"$4,955.50","balance":"-$66.00","refunded":"$66.00","amount_raw":"4955.500000","applied_raw":"4955.500000","refunded_raw":"66.000000","balance_raw":-66,"date":"30\/Sep\/2023","method":"Maestro","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0004","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000"},"paymentables":[{"invoice":"0022","amount_raw":"4955.5000","refunded_raw":"66.0000","net_raw":4889.5,"amount":"$4,955.50","refunded":"$66.00","net":"$4,889.50","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]},{"status":"Partially Refunded","badge":"
Partially Refunded<\/span><\/h6>","amount":"$2,290.75","applied":"$2,290.75","balance":"-$34.00","refunded":"$34.00","amount_raw":"2290.750000","applied_raw":"2290.750000","refunded_raw":"34.000000","balance_raw":-34,"date":"30\/Sep\/2023","method":"Diners Card","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0005","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000"},"paymentables":[{"invoice":"0023","amount_raw":"2290.7500","refunded_raw":"34.0000","net_raw":2256.75,"amount":"$2,290.75","refunded":"$34.00","net":"$2,256.75","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]},{"status":"Partially Refunded","badge":"
Partially Refunded<\/span><\/h6>","amount":"$6,802.13","applied":"$6,802.13","balance":"-$444.00","refunded":"$444.00","amount_raw":"6802.130000","applied_raw":"6802.130000","refunded_raw":"444.000000","balance_raw":-444,"date":"30\/Sep\/2023","method":"Maestro","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0006","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000"},"paymentables":[{"invoice":"0024","amount_raw":"6802.1300","refunded_raw":"444.0000","net_raw":6358.13,"amount":"$6,802.13","refunded":"$444.00","net":"$6,358.13","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]},{"status":"Partially Refunded","badge":"
Partially Refunded<\/span><\/h6>","amount":"$10,986.26","applied":"$10,986.26","balance":"-$146.26","refunded":"$146.26","amount_raw":"10986.260000","applied_raw":"10986.260000","refunded_raw":"146.260000","balance_raw":-146.26000000000022,"date":"30\/Sep\/2023","method":"UnionPay","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0007","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000"},"paymentables":[{"invoice":"0025","amount_raw":"10986.2600","refunded_raw":"146.2600","net_raw":10840,"amount":"$10,986.26","refunded":"$146.26","net":"$10,840.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]},{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$6,054.13","applied":"$6,054.13","balance":"$0.00","refunded":"$0.00","amount_raw":"6054.130000","applied_raw":"6054.130000","refunded_raw":"0.000000","balance_raw":0,"date":"30\/Sep\/2023","method":"","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0008","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Lowe-Paucek","balance":"38124.670000","payment_balance":"0.000000","credit_balance":"2270.590000"},"paymentables":[{"invoice":"0015","amount_raw":"6054.1300","refunded_raw":"0.0000","net_raw":6054.13,"amount":"$6,054.13","refunded":"$0.00","net":"$6,054.13","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696151008}]},{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$3,132.25","applied":"$3,132.25","balance":"$0.00","refunded":"$0.00","amount_raw":"3132.250000","applied_raw":"3132.250000","refunded_raw":"0.000000","balance_raw":0,"date":"30\/Sep\/2023","method":"","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0009","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"cypress","balance":"0.000000","payment_balance":"0.000000","credit_balance":"11661.820000"},"paymentables":[{"invoice":"0016","amount_raw":"3132.2500","refunded_raw":"0.0000","net_raw":3132.25,"amount":"$3,132.25","refunded":"$0.00","net":"$3,132.25","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696151008}]},{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$9,396.77","applied":"$9,396.77","balance":"$0.00","refunded":"$0.00","amount_raw":"9396.770000","applied_raw":"9396.770000","refunded_raw":"0.000000","balance_raw":0,"date":"30\/Sep\/2023","method":"","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0010","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"cypress","balance":"0.000000","payment_balance":"0.000000","credit_balance":"11661.820000"},"paymentables":[{"invoice":"0017","amount_raw":"9396.7700","refunded_raw":"0.0000","net_raw":9396.77,"amount":"$9,396.77","refunded":"$0.00","net":"$9,396.77","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696151008}]}]'; + public string $payment_data = '[{"status":"Refunded","badge":"
Refunded<\/span><\/h6>","amount":"$6,077.51","applied":"$6,077.51","balance":"-$6,077.51","refunded":"$6,077.51","amount_raw":"6077.510000","applied_raw":"6077.510000","refunded_raw":"6077.510000","balance_raw":-6077.51,"date":"30\/Sep\/2023","method":"EuroCard","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"cypress","balance":"0.000000","payment_balance":"0.000000","credit_balance":"11661.820000","vat_number":"VAT123"},"paymentables":[{"invoice":"0019","amount_raw":"6077.5100","refunded_raw":"6077.5100","net_raw":0,"amount":"$6,077.51","refunded":"$6,077.51","net":"$0.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]},{"status":"Refunded","badge":"
Refunded<\/span><\/h6>","amount":"$4,090.64","applied":"$4,090.64","balance":"-$4,090.64","refunded":"$4,090.64","amount_raw":"4090.640000","applied_raw":"4090.640000","refunded_raw":"4090.640000","balance_raw":-4090.64,"date":"30\/Sep\/2023","method":"Discover Card","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0002","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"cypress","balance":"0.000000","payment_balance":"0.000000","credit_balance":"11661.820000","vat_number":"VAT123"},"paymentables":[{"invoice":"0020","amount_raw":"4090.6400","refunded_raw":"4090.6400","net_raw":0,"amount":"$4,090.64","refunded":"$4,090.64","net":"$0.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]},{"status":"Refunded","badge":"
Refunded<\/span><\/h6>","amount":"$2,197.26","applied":"$2,197.26","balance":"-$2,197.26","refunded":"$2,197.26","amount_raw":"2197.260000","applied_raw":"2197.260000","refunded_raw":"2197.260000","balance_raw":-2197.26,"date":"30\/Sep\/2023","method":"Diners Card","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0003","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000","vat_number":"VAT123"},"paymentables":[{"invoice":"0021","amount_raw":"2197.2600","refunded_raw":"2197.2600","net_raw":0,"amount":"$2,197.26","refunded":"$2,197.26","net":"$0.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]},{"status":"Partially Refunded","badge":"
Partially Refunded<\/span><\/h6>","amount":"$4,955.50","applied":"$4,955.50","balance":"-$66.00","refunded":"$66.00","amount_raw":"4955.500000","applied_raw":"4955.500000","refunded_raw":"66.000000","balance_raw":-66,"date":"30\/Sep\/2023","method":"Maestro","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0004","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000","vat_number":"VAT123"},"paymentables":[{"invoice":"0022","amount_raw":"4955.5000","refunded_raw":"66.0000","net_raw":4889.5,"amount":"$4,955.50","refunded":"$66.00","net":"$4,889.50","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]},{"status":"Partially Refunded","badge":"
Partially Refunded<\/span><\/h6>","amount":"$2,290.75","applied":"$2,290.75","balance":"-$34.00","refunded":"$34.00","amount_raw":"2290.750000","applied_raw":"2290.750000","refunded_raw":"34.000000","balance_raw":-34,"date":"30\/Sep\/2023","method":"Diners Card","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0005","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000","vat_number":"VAT123"},"paymentables":[{"invoice":"0023","amount_raw":"2290.7500","refunded_raw":"34.0000","net_raw":2256.75,"amount":"$2,290.75","refunded":"$34.00","net":"$2,256.75","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]},{"status":"Partially Refunded","badge":"
Partially Refunded<\/span><\/h6>","amount":"$6,802.13","applied":"$6,802.13","balance":"-$444.00","refunded":"$444.00","amount_raw":"6802.130000","applied_raw":"6802.130000","refunded_raw":"444.000000","balance_raw":-444,"date":"30\/Sep\/2023","method":"Maestro","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0006","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000","vat_number":"VAT123"},"paymentables":[{"invoice":"0024","amount_raw":"6802.1300","refunded_raw":"444.0000","net_raw":6358.13,"amount":"$6,802.13","refunded":"$444.00","net":"$6,358.13","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]},{"status":"Partially Refunded","badge":"
Partially Refunded<\/span><\/h6>","amount":"$10,986.26","applied":"$10,986.26","balance":"-$146.26","refunded":"$146.26","amount_raw":"10986.260000","applied_raw":"10986.260000","refunded_raw":"146.260000","balance_raw":-146.26000000000022,"date":"30\/Sep\/2023","method":"UnionPay","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0007","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000","vat_number":"VAT123"},"paymentables":[{"invoice":"0025","amount_raw":"10986.2600","refunded_raw":"146.2600","net_raw":10840,"amount":"$10,986.26","refunded":"$146.26","net":"$10,840.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]},{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$6,054.13","applied":"$6,054.13","balance":"$0.00","refunded":"$0.00","amount_raw":"6054.130000","applied_raw":"6054.130000","refunded_raw":"0.000000","balance_raw":0,"date":"30\/Sep\/2023","method":"","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0008","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Lowe-Paucek","balance":"38124.670000","payment_balance":"0.000000","credit_balance":"2270.590000","vat_number":"VAT123"},"paymentables":[{"invoice":"0015","amount_raw":"6054.1300","refunded_raw":"0.0000","net_raw":6054.13,"amount":"$6,054.13","refunded":"$0.00","net":"$6,054.13","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696151008}]},{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$3,132.25","applied":"$3,132.25","balance":"$0.00","refunded":"$0.00","amount_raw":"3132.250000","applied_raw":"3132.250000","refunded_raw":"0.000000","balance_raw":0,"date":"30\/Sep\/2023","method":"","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0009","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"cypress","balance":"0.000000","payment_balance":"0.000000","credit_balance":"11661.820000","vat_number":"VAT123"},"paymentables":[{"invoice":"0016","amount_raw":"3132.2500","refunded_raw":"0.0000","net_raw":3132.25,"amount":"$3,132.25","refunded":"$0.00","net":"$3,132.25","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696151008}]},{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$9,396.77","applied":"$9,396.77","balance":"$0.00","refunded":"$0.00","amount_raw":"9396.770000","applied_raw":"9396.770000","refunded_raw":"0.000000","balance_raw":0,"date":"30\/Sep\/2023","method":"","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0010","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"cypress","balance":"0.000000","payment_balance":"0.000000","credit_balance":"11661.820000"},"paymentables":[{"invoice":"0017","amount_raw":"9396.7700","refunded_raw":"0.0000","net_raw":9396.77,"amount":"$9,396.77","refunded":"$0.00","net":"$9,396.77","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696151008}]}]'; public string $purchase_order_data = '[{"id":"l4zbq2dprO","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","vendor_id":"xYRdG7dDzO","amount":14,"balance":0,"client_id":"","status_id":"1","design_id":"Wpmbk5ezJn","created_at":1695799265,"updated_at":1695799268,"archived_at":0,"is_deleted":false,"number":"0001","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","due_date":"2023-09-28","terms":"","public_notes":"","private_notes":"","uses_inclusive_taxes":false,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"total_taxes":0,"is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","has_tasks":false,"has_expenses":false,"custom_surcharge1":0,"custom_surcharge2":0,"custom_surcharge3":0,"custom_surcharge4":0,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"16ae59d4-60a8-4edf-b3a3-58882df1c5bf","quantity":1,"cost":14,"product_key":"enterprise_plan","product_cost":0,"notes":"The Enterprise Plan","discount":0,"is_amount_discount":true,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":"0","line_total":14,"gross_line_total":14,"date":"","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"73","custom_value3":"Nesciunt sequi.","custom_value4":"Ratione inventore.","type_id":"1","tax_id":"1","tax_amount":0,"task_id":"","expense_id":""},{"_id":"c7ef7af8-2713-4376-89c5-6f2c9c148ea7","quantity":0,"cost":0,"product_key":"","product_cost":0,"notes":"","discount":0,"is_amount_discount":true,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":"0","line_total":0,"gross_line_total":0,"date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","type_id":"1","tax_id":"1","tax_amount":0,"task_id":"","expense_id":""}],"entity_type":"purchaseOrder","exchange_rate":1,"paid_to_date":0,"subscription_id":"","expense_id":"","currency_id":"","vendor":{"id":"xYRdG7dDzO","user_id":"wMvbmOeYAl","assigned_user_id":"","name":"Dr. Ottilie Gorczany PhD","website":"http:\/\/www.kihn.biz\/","private_notes":"Ullam ullam aut sed accusantium. Et amet ut et cumque. Dolorem rem doloremque eius aut laudantium soluta nihil.","public_notes":"","last_login":0,"address1":"93105","address2":"797 Medhurst Radial Suite 030","phone":"","city":"Lamberttown","state":"Kentucky","postal_code":"86694-1500","country_id":"4","currency_id":"1","custom_value1":"Et similique.","custom_value2":"Ducimus est.","custom_value3":"Ut unde aut quia.","custom_value4":"Rerum odio maxime.","is_deleted":false,"vat_number":"Hic sed vel sint eos et.","id_number":"Quod aut autem.","updated_at":1695796653,"archived_at":0,"created_at":1695796652,"number":"0004","language_id":"","contacts":{"App\\Models\\VendorContact":[{"id":"VolejRRejN","first_name":"Aisha","last_name":"Jerde","send_email":true,"email":"mariam40@example.com","created_at":1695796652,"updated_at":1695796652,"archived_at":0,"is_primary":true,"phone":"+1-828-839-4171","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","link":"http:\/\/ninja.test:8000\/vendor\/key_login\/vqQKXcwO2WsvkN4MPOAS6fpirMZP7gfc","last_login":0},{"id":"WpmbkR5azJ","first_name":"Willy","last_name":"Jacobs","send_email":true,"email":"qwolff@example.org","created_at":1695796652,"updated_at":1695796652,"archived_at":0,"is_primary":false,"phone":"979.822.6527","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","link":"http:\/\/ninja.test:8000\/vendor\/key_login\/A8g2xp3OLbNzpWlfPGIML2lk1LYNFJpx","last_login":0}]},"documents":{"App\\Models\\Document":[]}}},{"id":"kzPdy7aQro","user_id":"wMvbmOeYAl","project_id":"","assigned_user_id":"","vendor_id":"xYRdG7dDzO","amount":24,"balance":24,"client_id":"","status_id":"2","design_id":"Wpmbk5ezJn","created_at":1695799278,"updated_at":1695799290,"archived_at":0,"is_deleted":false,"number":"0002","discount":0,"po_number":"","date":"2023-09-27","last_sent_date":"","next_send_date":"","reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","due_date":"2023-09-28","terms":"","public_notes":"","private_notes":"","uses_inclusive_taxes":false,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"total_taxes":0,"is_amount_discount":true,"footer":"","partial":0,"partial_due_date":"","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","has_tasks":false,"has_expenses":false,"custom_surcharge1":0,"custom_surcharge2":0,"custom_surcharge3":0,"custom_surcharge4":0,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"_id":"a9fa64d0-e11b-47ce-8d75-d126769cd17d","quantity":1,"cost":14,"product_key":"enterprise_plan","product_cost":0,"notes":"The Enterprise Plan","discount":0,"is_amount_discount":true,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":"0","line_total":14,"gross_line_total":14,"date":"","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"73","custom_value3":"Nesciunt sequi.","custom_value4":"Ratione inventore.","type_id":"1","tax_id":"1","tax_amount":0,"task_id":"","expense_id":""},{"_id":"6b8a7e41-f140-499a-ac3d-7f1916aa7e00","quantity":1,"cost":10,"product_key":"pro_plan","product_cost":0,"notes":"The Pro Plan","discount":0,"is_amount_discount":true,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":"0","line_total":10,"gross_line_total":10,"date":"","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"81","custom_value3":"Enim quis deleniti.","custom_value4":"Numquam quia quas.","type_id":"1","tax_id":"1","tax_amount":0,"task_id":"","expense_id":""}],"entity_type":"purchaseOrder","exchange_rate":1,"paid_to_date":0,"subscription_id":"","expense_id":"","currency_id":"","vendor":{"id":"xYRdG7dDzO","user_id":"wMvbmOeYAl","assigned_user_id":"","name":"Dr. Ottilie Gorczany PhD","website":"http:\/\/www.kihn.biz\/","private_notes":"Ullam ullam aut sed accusantium. Et amet ut et cumque. Dolorem rem doloremque eius aut laudantium soluta nihil.","public_notes":"","last_login":0,"address1":"93105","address2":"797 Medhurst Radial Suite 030","phone":"","city":"Lamberttown","state":"Kentucky","postal_code":"86694-1500","country_id":"4","currency_id":"1","custom_value1":"Et similique.","custom_value2":"Ducimus est.","custom_value3":"Ut unde aut quia.","custom_value4":"Rerum odio maxime.","is_deleted":false,"vat_number":"Hic sed vel sint eos et.","id_number":"Quod aut autem.","updated_at":1695796653,"archived_at":0,"created_at":1695796652,"number":"0004","language_id":"","contacts":{"App\\Models\\VendorContact":[{"id":"VolejRRejN","first_name":"Aisha","last_name":"Jerde","send_email":true,"email":"mariam40@example.com","created_at":1695796652,"updated_at":1695796652,"archived_at":0,"is_primary":true,"phone":"+1-828-839-4171","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","link":"http:\/\/ninja.test:8000\/vendor\/key_login\/vqQKXcwO2WsvkN4MPOAS6fpirMZP7gfc","last_login":0},{"id":"WpmbkR5azJ","first_name":"Willy","last_name":"Jacobs","send_email":true,"email":"qwolff@example.org","created_at":1695796652,"updated_at":1695796652,"archived_at":0,"is_primary":false,"phone":"979.822.6527","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","link":"http:\/\/ninja.test:8000\/vendor\/key_login\/A8g2xp3OLbNzpWlfPGIML2lk1LYNFJpx","last_login":0}]},"documents":{"App\\Models\\Document":[]}}}]'; - public string $project_data = '[{"name":"Abel Moore","number":"0001","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$107.00","task_rate_raw":"107.000000","due_date":"25\/Nov\/2023","private_notes":"","public_notes":"Omnis modi optio maxime ut inventore.","budgeted_hours":339,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":390,"tasks":[{"number":"0002","description":"Et dolorem nihil qui quas asperiores nulla aut praesentium. Ea quasi porro facere eligendi. Et assumenda illum nostrum natus repellat eveniet. Sequi odio nulla perspiciatis doloremque.","duration":966982,"rate":"$76.00","rate_raw":"76.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428466,"start_date":"19\/Nov\/2023 21:11:26","end_date_raw":1700492035,"end_date":"20\/Nov\/2023 14:11:55","description":"Nihil voluptas et sint et.","billable":true,"duration":63569},{"start_date_raw":1700492335,"start_date":"20\/Nov\/2023 14:11:55","end_date_raw":1700554011,"end_date":"21\/Nov\/2023 08:11:51","description":"Aut consequuntur aliquam earum aut reiciendis.","billable":false,"duration":61676},{"start_date_raw":1700554311,"start_date":"21\/Nov\/2023 08:11:51","end_date_raw":1700586651,"end_date":"21\/Nov\/2023 17:11:51","description":"Occaecati consectetur temporibus neque rerum sed rem iure.","billable":true,"duration":32340},{"start_date_raw":1700586951,"start_date":"21\/Nov\/2023 17:11:51","end_date_raw":1700644903,"end_date":"22\/Nov\/2023 09:11:43","description":"Ducimus voluptate aliquid aliquam nobis.","billable":true,"duration":57952},{"start_date_raw":1700645203,"start_date":"22\/Nov\/2023 09:11:43","end_date_raw":1700724132,"end_date":"23\/Nov\/2023 07:11:12","description":"Non ipsam consequatur voluptatem illum.","billable":true,"duration":78929},{"start_date_raw":1700724432,"start_date":"23\/Nov\/2023 07:11:12","end_date_raw":1700790596,"end_date":"24\/Nov\/2023 01:11:56","description":"Aspernatur quia voluptate molestias non.","billable":false,"duration":66164},{"start_date_raw":1700790896,"start_date":"24\/Nov\/2023 01:11:56","end_date_raw":1700812808,"end_date":"24\/Nov\/2023 08:11:08","description":"Sed quod omnis officiis asperiores natus facere minus nemo.","billable":false,"duration":21912},{"start_date_raw":1700813108,"start_date":"24\/Nov\/2023 08:11:08","end_date_raw":1700865275,"end_date":"24\/Nov\/2023 22:11:35","description":"Tenetur quaerat ea magni placeat.","billable":false,"duration":52167},{"start_date_raw":1700865575,"start_date":"24\/Nov\/2023 22:11:35","end_date_raw":1700888516,"end_date":"25\/Nov\/2023 05:11:56","description":"Sequi dolor laborum deserunt rerum.","billable":true,"duration":22941},{"start_date_raw":1700888816,"start_date":"25\/Nov\/2023 05:11:56","end_date_raw":1700933259,"end_date":"25\/Nov\/2023 17:11:39","description":"Est qui velit ipsum et nesciunt qui ut.","billable":true,"duration":44443},{"start_date_raw":1700933559,"start_date":"25\/Nov\/2023 17:11:39","end_date_raw":1700979107,"end_date":"26\/Nov\/2023 06:11:47","description":"Sint et quo quo.","billable":false,"duration":45548},{"start_date_raw":1700979407,"start_date":"26\/Nov\/2023 06:11:47","end_date_raw":1701002669,"end_date":"26\/Nov\/2023 12:11:29","description":"Omnis unde sit similique dolor fugit totam.","billable":true,"duration":23262},{"start_date_raw":1701002969,"start_date":"26\/Nov\/2023 12:11:29","end_date_raw":1701071339,"end_date":"27\/Nov\/2023 07:11:59","description":"Ducimus qui voluptas accusamus.","billable":true,"duration":68370},{"start_date_raw":1701071639,"start_date":"27\/Nov\/2023 07:11:59","end_date_raw":1701100825,"end_date":"27\/Nov\/2023 16:11:25","description":"Soluta sit non nobis ab et ad libero sint.","billable":false,"duration":29186},{"start_date_raw":1701101125,"start_date":"27\/Nov\/2023 16:11:25","end_date_raw":1701157799,"end_date":"28\/Nov\/2023 07:11:59","description":"Cumque dignissimos error qui ut.","billable":true,"duration":56674},{"start_date_raw":1701158099,"start_date":"28\/Nov\/2023 07:11:59","end_date_raw":1701214020,"end_date":"28\/Nov\/2023 23:11:00","description":"Molestias omnis aliquid voluptatem cupiditate ut.","billable":true,"duration":55921},{"start_date_raw":1701214320,"start_date":"28\/Nov\/2023 23:11:00","end_date_raw":1701286375,"end_date":"29\/Nov\/2023 19:11:55","description":"Distinctio commodi est ab.","billable":true,"duration":72055},{"start_date_raw":1701286675,"start_date":"29\/Nov\/2023 19:11:55","end_date_raw":1701330081,"end_date":"30\/Nov\/2023 07:11:21","description":"Nisi dolores omnis veritatis.","billable":false,"duration":43406},{"start_date_raw":1701330381,"start_date":"30\/Nov\/2023 07:11:21","end_date_raw":1701398228,"end_date":"01\/Dec\/2023 02:12:08","description":"Qui aut velit quam dolore qui asperiores.","billable":false,"duration":67847},{"start_date_raw":1701398528,"start_date":"01\/Dec\/2023 02:12:08","end_date_raw":1701401148,"end_date":"01\/Dec\/2023 03:12:48","description":"Laudantium est laudantium ea ut repellendus.","billable":true,"duration":2620}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000"}},{"number":"0003","description":"Qui excepturi et aut et voluptates eius perferendis. Repellat eum illo quis aliquid occaecati reprehenderit officia. Est earum nihil similique recusandae aut ut est error. Enim molestiae assumenda quaerat neque unde. Consequatur vel placeat commodi molestiae.","duration":259657,"rate":"$9.00","rate_raw":"9.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428466,"start_date":"19\/Nov\/2023 21:11:26","end_date_raw":1700498928,"end_date":"20\/Nov\/2023 16:11:48","description":"Animi asperiores velit quaerat sapiente dolorem officiis.","billable":false,"duration":70462},{"start_date_raw":1700499228,"start_date":"20\/Nov\/2023 16:11:48","end_date_raw":1700516753,"end_date":"20\/Nov\/2023 21:11:53","description":"Et facere ut tempora similique et sunt culpa.","billable":false,"duration":17525},{"start_date_raw":1700517053,"start_date":"20\/Nov\/2023 21:11:53","end_date_raw":1700523921,"end_date":"20\/Nov\/2023 23:11:21","description":"Consequatur enim non reprehenderit quia.","billable":false,"duration":6868},{"start_date_raw":1700524221,"start_date":"20\/Nov\/2023 23:11:21","end_date_raw":1700609374,"end_date":"21\/Nov\/2023 23:11:34","description":"Nobis non nesciunt ut reprehenderit at.","billable":false,"duration":85153},{"start_date_raw":1700609674,"start_date":"21\/Nov\/2023 23:11:34","end_date_raw":1700689323,"end_date":"22\/Nov\/2023 21:11:03","description":"Blanditiis repellendus quo voluptatum eveniet iste.","billable":false,"duration":79649}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Ready to do","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000"}},{"number":"0004","description":"Ipsam tempora id vero perferendis. Nulla laudantium iste qui quod et voluptatem. Aliquam et vel est minus ratione.","duration":179131,"rate":"$146.00","rate_raw":"146.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428466,"start_date":"19\/Nov\/2023 21:11:26","end_date_raw":1700446786,"end_date":"20\/Nov\/2023 02:11:46","description":"Ipsam voluptatum sed officiis eos quo.","billable":true,"duration":18320},{"start_date_raw":1700447086,"start_date":"20\/Nov\/2023 02:11:46","end_date_raw":1700520087,"end_date":"20\/Nov\/2023 22:11:27","description":"Et maxime rem provident veritatis.","billable":true,"duration":73001},{"start_date_raw":1700520387,"start_date":"20\/Nov\/2023 22:11:27","end_date_raw":1700603783,"end_date":"21\/Nov\/2023 21:11:23","description":"Deserunt soluta dolorem harum voluptas necessitatibus eum laborum omnis.","billable":false,"duration":83396},{"start_date_raw":1700604083,"start_date":"21\/Nov\/2023 22:11:23","end_date_raw":1700608497,"end_date":"21\/Nov\/2023 23:11:57","description":"Esse et aperiam nobis dolor voluptas.","billable":true,"duration":4414}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000"}}],"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},{"name":"Prof. Noah Jaskolski II","number":"0002","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$52.00","task_rate_raw":"52.000000","due_date":"25\/Nov\/2023","private_notes":"","public_notes":"Mollitia ut vel quam. Quia et aut minus.","budgeted_hours":660,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":57,"tasks":[{"number":"0006","description":"Dolor quidem aperiam rerum. Voluptates aut vel ut consequatur. Nam et unde cupiditate qui voluptates voluptatum. Temporibus assumenda enim nam neque.","duration":156986,"rate":"$92.00","rate_raw":"92.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428467,"start_date":"19\/Nov\/2023 21:11:27","end_date_raw":1700443047,"end_date":"20\/Nov\/2023 01:11:27","description":"Unde sequi dicta corporis odio.","billable":true,"duration":14580},{"start_date_raw":1700443347,"start_date":"20\/Nov\/2023 01:11:27","end_date_raw":1700489146,"end_date":"20\/Nov\/2023 14:11:46","description":"Qui rem id inventore velit corporis vitae.","billable":false,"duration":45799},{"start_date_raw":1700489446,"start_date":"20\/Nov\/2023 14:11:46","end_date_raw":1700514655,"end_date":"20\/Nov\/2023 21:11:55","description":"Rerum repellat unde et blanditiis sunt animi aliquid accusantium.","billable":false,"duration":25209},{"start_date_raw":1700514955,"start_date":"20\/Nov\/2023 21:11:55","end_date_raw":1700515449,"end_date":"20\/Nov\/2023 21:11:09","description":"Quasi velit sit et explicabo quibusdam nam.","billable":true,"duration":494},{"start_date_raw":1700515749,"start_date":"20\/Nov\/2023 21:11:09","end_date_raw":1700586653,"end_date":"21\/Nov\/2023 17:11:53","description":"Numquam eos aut eum est corrupti dolorem et.","billable":false,"duration":70904}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Ready to do","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"cypress","balance":"13866.150000","payment_balance":"0.000000","credit_balance":"1013.630000"}},{"number":"0007","description":"Omnis totam eum sed dolores quod rerum. Ducimus voluptate iste quia dolorum consequatur sint. Velit vitae sint qui molestias. Dolores ea rerum voluptates iusto qui natus beatae.","duration":47670,"rate":"$88.00","rate_raw":"88.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428467,"start_date":"19\/Nov\/2023 21:11:27","end_date_raw":1700476137,"end_date":"20\/Nov\/2023 10:11:57","description":"Sint laudantium quia eveniet quod nobis occaecati nihil.","billable":false,"duration":47670}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"cypress","balance":"13866.150000","payment_balance":"0.000000","credit_balance":"1013.630000"}}],"client":{"name":"cypress","balance":"13866.150000","payment_balance":"0.000000","credit_balance":"1013.630000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},{"name":"Mr. Easton Streich","number":"0003","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$153.00","task_rate_raw":"153.000000","due_date":"28\/Nov\/2023","private_notes":"","public_notes":"Debitis sit ut voluptatem eaque veritatis.","budgeted_hours":216,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":496,"tasks":[{"number":"0009","description":"Ipsam numquam nesciunt corporis veritatis vitae porro maiores. Delectus sit itaque dolores. Atque et dolorem nisi est.","duration":439161,"rate":"$120.00","rate_raw":"120.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700434593,"end_date":"19\/Nov\/2023 22:11:33","description":"At unde dolores quasi quia.","billable":true,"duration":6125},{"start_date_raw":1700434893,"start_date":"19\/Nov\/2023 23:11:33","end_date_raw":1700498703,"end_date":"20\/Nov\/2023 16:11:03","description":"Et quae non voluptatum nam quia velit suscipit.","billable":false,"duration":63810},{"start_date_raw":1700499003,"start_date":"20\/Nov\/2023 16:11:03","end_date_raw":1700548104,"end_date":"21\/Nov\/2023 06:11:24","description":"Quidem delectus sed et.","billable":true,"duration":49101},{"start_date_raw":1700548404,"start_date":"21\/Nov\/2023 06:11:24","end_date_raw":1700629022,"end_date":"22\/Nov\/2023 04:11:02","description":"Soluta velit enim explicabo dolorem commodi.","billable":false,"duration":80618},{"start_date_raw":1700629322,"start_date":"22\/Nov\/2023 05:11:02","end_date_raw":1700647716,"end_date":"22\/Nov\/2023 10:11:36","description":"Est magni qui quis.","billable":false,"duration":18394},{"start_date_raw":1700648016,"start_date":"22\/Nov\/2023 10:11:36","end_date_raw":1700731147,"end_date":"23\/Nov\/2023 09:11:07","description":"Saepe aspernatur non molestias dolor ea quos in.","billable":false,"duration":83131},{"start_date_raw":1700731447,"start_date":"23\/Nov\/2023 09:11:07","end_date_raw":1700782753,"end_date":"23\/Nov\/2023 23:11:13","description":"Alias id nihil laboriosam aliquam odio qui excepturi.","billable":true,"duration":51306},{"start_date_raw":1700783053,"start_date":"23\/Nov\/2023 23:11:13","end_date_raw":1700795456,"end_date":"24\/Nov\/2023 03:11:56","description":"Eos numquam et atque quia a qui nesciunt.","billable":false,"duration":12403},{"start_date_raw":1700795756,"start_date":"24\/Nov\/2023 03:11:56","end_date_raw":1700812488,"end_date":"24\/Nov\/2023 07:11:48","description":"Ut voluptas in natus qui.","billable":false,"duration":16732},{"start_date_raw":1700812788,"start_date":"24\/Nov\/2023 07:11:48","end_date_raw":1700842826,"end_date":"24\/Nov\/2023 16:11:26","description":"Est aut magnam ratione.","billable":false,"duration":30038},{"start_date_raw":1700843126,"start_date":"24\/Nov\/2023 16:11:26","end_date_raw":1700870629,"end_date":"25\/Nov\/2023 00:11:49","description":"Exercitationem non odio quasi ut saepe.","billable":true,"duration":27503}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}},{"number":"0010","description":"Quo recusandae optio est saepe consectetur optio. Accusantium eum quia eaque. Voluptatum eligendi similique velit dolor eos rerum cumque quaerat.","duration":425934,"rate":"$98.00","rate_raw":"98.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700463790,"end_date":"20\/Nov\/2023 07:11:10","description":"Culpa aut consequatur earum ut.","billable":false,"duration":35322},{"start_date_raw":1700464090,"start_date":"20\/Nov\/2023 07:11:10","end_date_raw":1700536862,"end_date":"21\/Nov\/2023 03:11:02","description":"Reprehenderit et esse qui hic quia est iusto.","billable":false,"duration":72772},{"start_date_raw":1700537162,"start_date":"21\/Nov\/2023 03:11:02","end_date_raw":1700592394,"end_date":"21\/Nov\/2023 18:11:34","description":"In est enim dolore nesciunt distinctio magni qui.","billable":true,"duration":55232},{"start_date_raw":1700592694,"start_date":"21\/Nov\/2023 18:11:34","end_date_raw":1700635771,"end_date":"22\/Nov\/2023 06:11:31","description":"Est saepe quasi alias aut odit officiis corporis.","billable":true,"duration":43077},{"start_date_raw":1700636071,"start_date":"22\/Nov\/2023 06:11:31","end_date_raw":1700637953,"end_date":"22\/Nov\/2023 07:11:53","description":"Consequuntur ipsa ut voluptate accusamus quibusdam sint sed.","billable":false,"duration":1882},{"start_date_raw":1700638253,"start_date":"22\/Nov\/2023 07:11:53","end_date_raw":1700687668,"end_date":"22\/Nov\/2023 21:11:28","description":"Sunt similique error et nostrum reprehenderit dolor.","billable":false,"duration":49415},{"start_date_raw":1700687968,"start_date":"22\/Nov\/2023 21:11:28","end_date_raw":1700712068,"end_date":"23\/Nov\/2023 04:11:08","description":"Aut rerum quis fugiat nostrum facilis ut.","billable":false,"duration":24100},{"start_date_raw":1700712368,"start_date":"23\/Nov\/2023 04:11:08","end_date_raw":1700783951,"end_date":"23\/Nov\/2023 23:11:11","description":"Aut culpa omnis sint et quos quisquam sint.","billable":true,"duration":71583},{"start_date_raw":1700784251,"start_date":"24\/Nov\/2023 00:11:11","end_date_raw":1700845166,"end_date":"24\/Nov\/2023 16:11:26","description":"Voluptas ut ratione porro eaque iste voluptas.","billable":true,"duration":60915},{"start_date_raw":1700845466,"start_date":"24\/Nov\/2023 17:11:26","end_date_raw":1700857102,"end_date":"24\/Nov\/2023 20:11:22","description":"Qui ipsa minus sed saepe maiores necessitatibus.","billable":true,"duration":11636}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Done","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}},{"number":"0011","description":"Eligendi molestiae et quis et tempora esse ut. Sed ut est possimus et minus aut incidunt. Quibusdam rerum incidunt molestias est qui quam temporibus fuga.","duration":637522,"rate":"$120.00","rate_raw":"120.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700499282,"end_date":"20\/Nov\/2023 16:11:42","description":"Quasi temporibus doloremque consequatur minus pariatur facere.","billable":true,"duration":70814},{"start_date_raw":1700499582,"start_date":"20\/Nov\/2023 16:11:42","end_date_raw":1700584386,"end_date":"21\/Nov\/2023 16:11:06","description":"Id distinctio sed eos qui.","billable":true,"duration":84804},{"start_date_raw":1700584686,"start_date":"21\/Nov\/2023 16:11:06","end_date_raw":1700635554,"end_date":"22\/Nov\/2023 06:11:54","description":"Facere explicabo non nostrum.","billable":true,"duration":50868},{"start_date_raw":1700635854,"start_date":"22\/Nov\/2023 06:11:54","end_date_raw":1700672533,"end_date":"22\/Nov\/2023 17:11:13","description":"Numquam sit labore facere voluptatibus quibusdam reiciendis et.","billable":true,"duration":36679},{"start_date_raw":1700672833,"start_date":"22\/Nov\/2023 17:11:13","end_date_raw":1700678587,"end_date":"22\/Nov\/2023 18:11:07","description":"Perspiciatis ad hic nostrum et.","billable":true,"duration":5754},{"start_date_raw":1700678887,"start_date":"22\/Nov\/2023 18:11:07","end_date_raw":1700708730,"end_date":"23\/Nov\/2023 03:11:30","description":"Qui culpa iure eos quaerat voluptatum numquam inventore.","billable":true,"duration":29843},{"start_date_raw":1700709030,"start_date":"23\/Nov\/2023 03:11:30","end_date_raw":1700765439,"end_date":"23\/Nov\/2023 18:11:39","description":"Similique molestiae atque voluptatem debitis dolorem quos quis et.","billable":false,"duration":56409},{"start_date_raw":1700765739,"start_date":"23\/Nov\/2023 18:11:39","end_date_raw":1700831780,"end_date":"24\/Nov\/2023 13:11:20","description":"Nam dolorum optio et omnis.","billable":true,"duration":66041},{"start_date_raw":1700832080,"start_date":"24\/Nov\/2023 13:11:20","end_date_raw":1700844498,"end_date":"24\/Nov\/2023 16:11:18","description":"Non eos amet repellat tempore id.","billable":false,"duration":12418},{"start_date_raw":1700844798,"start_date":"24\/Nov\/2023 16:11:18","end_date_raw":1700899153,"end_date":"25\/Nov\/2023 07:11:13","description":"Iste neque nostrum laudantium officia.","billable":false,"duration":54355},{"start_date_raw":1700899453,"start_date":"25\/Nov\/2023 08:11:13","end_date_raw":1700971949,"end_date":"26\/Nov\/2023 04:11:29","description":"Ut quia ratione sed et.","billable":true,"duration":72496},{"start_date_raw":1700972249,"start_date":"26\/Nov\/2023 04:11:29","end_date_raw":1700984833,"end_date":"26\/Nov\/2023 07:11:13","description":"Sapiente quia magni quisquam eos rerum rem.","billable":false,"duration":12584},{"start_date_raw":1700985133,"start_date":"26\/Nov\/2023 07:11:13","end_date_raw":1701069590,"end_date":"27\/Nov\/2023 07:11:50","description":"Nulla et ducimus doloribus est.","billable":true,"duration":84457}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Done","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}},{"number":"0012","description":"Ea cumque amet quas et suscipit. Voluptatum libero enim minus necessitatibus qui voluptatem. Voluptates soluta quae in et aut possimus veniam.","duration":283580,"rate":"$78.00","rate_raw":"78.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700469690,"end_date":"20\/Nov\/2023 08:11:30","description":"Placeat vel sit voluptas architecto sed.","billable":true,"duration":41222},{"start_date_raw":1700469990,"start_date":"20\/Nov\/2023 08:11:30","end_date_raw":1700483859,"end_date":"20\/Nov\/2023 12:11:39","description":"Voluptatem est quo est dolorem.","billable":true,"duration":13869},{"start_date_raw":1700484159,"start_date":"20\/Nov\/2023 12:11:39","end_date_raw":1700541376,"end_date":"21\/Nov\/2023 04:11:16","description":"Perferendis nulla quos omnis inventore sint.","billable":false,"duration":57217},{"start_date_raw":1700541676,"start_date":"21\/Nov\/2023 04:11:16","end_date_raw":1700609280,"end_date":"21\/Nov\/2023 23:11:00","description":"Quia quae ad cum neque.","billable":true,"duration":67604},{"start_date_raw":1700609580,"start_date":"21\/Nov\/2023 23:11:00","end_date_raw":1700668490,"end_date":"22\/Nov\/2023 15:11:50","description":"Pariatur et ipsa cumque consequatur voluptatum nemo.","billable":true,"duration":58910},{"start_date_raw":1700668790,"start_date":"22\/Nov\/2023 15:11:50","end_date_raw":1700690815,"end_date":"22\/Nov\/2023 22:11:55","description":"Officia explicabo illo ex tenetur.","billable":true,"duration":22025},{"start_date_raw":1700691115,"start_date":"22\/Nov\/2023 22:11:55","end_date_raw":1700713848,"end_date":"23\/Nov\/2023 04:11:48","description":"Quasi neque tempore aut at.","billable":true,"duration":22733}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Ready to do","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}}],"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},{"name":"Elenor Orn","number":"0004","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$39.00","task_rate_raw":"39.000000","due_date":"27\/Nov\/2023","private_notes":"","public_notes":"Distinctio ut voluptas deleniti est sed quae.","budgeted_hours":372,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":331,"tasks":[{"number":"0014","description":"In soluta aliquid et eius. Molestiae veritatis animi culpa et amet porro modi ut. Id sequi nobis itaque modi explicabo voluptatem quam. Non ex voluptatem error aspernatur odit.","duration":346244,"rate":"$70.00","rate_raw":"70.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700458211,"end_date":"20\/Nov\/2023 05:11:11","description":"Voluptate aut dicta recusandae consectetur est ducimus.","billable":false,"duration":29743},{"start_date_raw":1700458511,"start_date":"20\/Nov\/2023 05:11:11","end_date_raw":1700516247,"end_date":"20\/Nov\/2023 21:11:27","description":"Dolores incidunt praesentium rerum.","billable":false,"duration":57736},{"start_date_raw":1700516547,"start_date":"20\/Nov\/2023 21:11:27","end_date_raw":1700549251,"end_date":"21\/Nov\/2023 06:11:31","description":"Perspiciatis consequatur et alias praesentium placeat modi aut.","billable":true,"duration":32704},{"start_date_raw":1700549551,"start_date":"21\/Nov\/2023 06:11:31","end_date_raw":1700618445,"end_date":"22\/Nov\/2023 02:11:45","description":"Esse libero incidunt non rem sunt quisquam repudiandae nisi.","billable":true,"duration":68894},{"start_date_raw":1700618745,"start_date":"22\/Nov\/2023 02:11:45","end_date_raw":1700698086,"end_date":"23\/Nov\/2023 00:11:06","description":"Earum consectetur esse fugit sint autem tempore.","billable":true,"duration":79341},{"start_date_raw":1700698386,"start_date":"23\/Nov\/2023 00:11:06","end_date_raw":1700776212,"end_date":"23\/Nov\/2023 21:11:12","description":"Saepe sit consequatur vel eos ad iusto nobis.","billable":true,"duration":77826}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Ready to do","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}},{"number":"0015","description":"Minus accusamus illum quia nihil voluptatum qui mollitia vel. Natus fugiat sequi quod eius occaecati non. Minus rerum ut eos est eveniet quae iure.","duration":410859,"rate":"$13.00","rate_raw":"13.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700506053,"end_date":"20\/Nov\/2023 18:11:33","description":"Iste neque officiis eum maiores.","billable":true,"duration":77585},{"start_date_raw":1700506353,"start_date":"20\/Nov\/2023 18:11:33","end_date_raw":1700572042,"end_date":"21\/Nov\/2023 13:11:22","description":"Minus perferendis quia amet.","billable":true,"duration":65689},{"start_date_raw":1700572342,"start_date":"21\/Nov\/2023 13:11:22","end_date_raw":1700637291,"end_date":"22\/Nov\/2023 07:11:51","description":"Commodi quaerat hic minus et voluptas velit.","billable":true,"duration":64949},{"start_date_raw":1700637591,"start_date":"22\/Nov\/2023 07:11:51","end_date_raw":1700649610,"end_date":"22\/Nov\/2023 10:11:10","description":"Vitae rerum natus aperiam quia explicabo.","billable":false,"duration":12019},{"start_date_raw":1700649910,"start_date":"22\/Nov\/2023 10:11:10","end_date_raw":1700693674,"end_date":"22\/Nov\/2023 22:11:34","description":"Quos sunt dolorum eveniet provident ut.","billable":false,"duration":43764},{"start_date_raw":1700693974,"start_date":"22\/Nov\/2023 22:11:34","end_date_raw":1700775335,"end_date":"23\/Nov\/2023 21:11:35","description":"Animi quibusdam quisquam ea error earum consectetur.","billable":true,"duration":81361},{"start_date_raw":1700775635,"start_date":"23\/Nov\/2023 21:11:35","end_date_raw":1700808126,"end_date":"24\/Nov\/2023 06:11:06","description":"Ratione ipsam molestiae dolorem sit architecto voluptas.","billable":true,"duration":32491},{"start_date_raw":1700808426,"start_date":"24\/Nov\/2023 06:11:06","end_date_raw":1700817758,"end_date":"24\/Nov\/2023 09:11:38","description":"Maxime reprehenderit voluptates culpa.","billable":false,"duration":9332},{"start_date_raw":1700818058,"start_date":"24\/Nov\/2023 09:11:38","end_date_raw":1700841727,"end_date":"24\/Nov\/2023 16:11:07","description":"Atque deleniti et laboriosam molestias repellat accusamus omnis.","billable":false,"duration":23669}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}},{"number":"0016","description":"Temporibus illum voluptatibus molestias quia omnis illo molestias corporis. Hic et hic quia dolores quas sint dolorem. Repellendus minus quae fuga illum amet in voluptatum. Rerum mollitia est eum voluptatum architecto non nisi qui. Est et dolores omnis placeat repellat sed facilis.","duration":435319,"rate":"$89.00","rate_raw":"89.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428469,"start_date":"19\/Nov\/2023 21:11:29","end_date_raw":1700496403,"end_date":"20\/Nov\/2023 16:11:43","description":"Sunt unde repellat reiciendis quos porro et dolores.","billable":true,"duration":67934},{"start_date_raw":1700496703,"start_date":"20\/Nov\/2023 16:11:43","end_date_raw":1700551129,"end_date":"21\/Nov\/2023 07:11:49","description":"Voluptatem laborum repudiandae enim asperiores.","billable":false,"duration":54426},{"start_date_raw":1700551429,"start_date":"21\/Nov\/2023 07:11:49","end_date_raw":1700631865,"end_date":"22\/Nov\/2023 05:11:25","description":"Placeat numquam magnam occaecati.","billable":false,"duration":80436},{"start_date_raw":1700632165,"start_date":"22\/Nov\/2023 05:11:25","end_date_raw":1700695854,"end_date":"22\/Nov\/2023 23:11:54","description":"Qui quo et est vero autem reprehenderit.","billable":false,"duration":63689},{"start_date_raw":1700696154,"start_date":"22\/Nov\/2023 23:11:54","end_date_raw":1700736857,"end_date":"23\/Nov\/2023 10:11:17","description":"Et voluptatem distinctio dolor fuga hic ea.","billable":false,"duration":40703},{"start_date_raw":1700737157,"start_date":"23\/Nov\/2023 10:11:17","end_date_raw":1700790692,"end_date":"24\/Nov\/2023 01:11:32","description":"Quo expedita quidem ab dolor quam expedita porro.","billable":true,"duration":53535},{"start_date_raw":1700790992,"start_date":"24\/Nov\/2023 01:11:32","end_date_raw":1700817527,"end_date":"24\/Nov\/2023 09:11:47","description":"Adipisci voluptatem officiis quaerat ut quos facilis.","billable":false,"duration":26535},{"start_date_raw":1700817827,"start_date":"24\/Nov\/2023 09:11:47","end_date_raw":1700865888,"end_date":"24\/Nov\/2023 22:11:48","description":"Tenetur ut dolorem vero.","billable":true,"duration":48061}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Done","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}}],"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},{"name":"Maryjane Macejkovic","number":"0005","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$78.00","task_rate_raw":"78.000000","due_date":"26\/Nov\/2023","private_notes":"","public_notes":"Nesciunt est sit ea explicabo.","budgeted_hours":405,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":194,"tasks":[{"number":"0018","description":"Odit rerum iusto quibusdam. A mollitia cupiditate enim consequatur omnis qui voluptas quibusdam. Recusandae et non ut ipsum asperiores non iusto.","duration":312865,"rate":"$95.00","rate_raw":"95.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428469,"start_date":"19\/Nov\/2023 21:11:29","end_date_raw":1700476677,"end_date":"20\/Nov\/2023 10:11:57","description":"Quam dolores ut dolorem quo sint atque.","billable":true,"duration":48208},{"start_date_raw":1700476977,"start_date":"20\/Nov\/2023 10:11:57","end_date_raw":1700520944,"end_date":"20\/Nov\/2023 22:11:44","description":"Unde minus veniam corporis qui laboriosam suscipit quas.","billable":true,"duration":43967},{"start_date_raw":1700521244,"start_date":"20\/Nov\/2023 23:11:44","end_date_raw":1700602639,"end_date":"21\/Nov\/2023 21:11:19","description":"Beatae molestiae molestias sed dolor recusandae et id eligendi.","billable":false,"duration":81395},{"start_date_raw":1700602939,"start_date":"21\/Nov\/2023 21:11:19","end_date_raw":1700682077,"end_date":"22\/Nov\/2023 19:11:17","description":"Repellendus nam perspiciatis exercitationem in iste officia.","billable":true,"duration":79138},{"start_date_raw":1700682377,"start_date":"22\/Nov\/2023 19:11:17","end_date_raw":1700692054,"end_date":"22\/Nov\/2023 22:11:34","description":"Consequatur quaerat dolor consequuntur aperiam enim reiciendis.","billable":true,"duration":9677},{"start_date_raw":1700692354,"start_date":"22\/Nov\/2023 22:11:34","end_date_raw":1700742834,"end_date":"23\/Nov\/2023 12:11:54","description":"Qui quia ut sed accusantium odit reprehenderit quaerat.","billable":true,"duration":50480}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Medhurst Inc","balance":"37633.780000","payment_balance":"0.000000","credit_balance":"1025.100000"}},{"number":"0019","description":"Eius et dolor libero repellendus iste. Nemo sit error sed necessitatibus architecto et. Aspernatur omnis doloremque animi quas sed.","duration":387217,"rate":"$87.00","rate_raw":"87.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428469,"start_date":"19\/Nov\/2023 21:11:29","end_date_raw":1700434042,"end_date":"19\/Nov\/2023 22:11:22","description":"Aut aliquam totam in reprehenderit sint suscipit earum.","billable":false,"duration":5573},{"start_date_raw":1700434342,"start_date":"19\/Nov\/2023 22:11:22","end_date_raw":1700467844,"end_date":"20\/Nov\/2023 08:11:44","description":"Hic aliquid natus est.","billable":false,"duration":33502},{"start_date_raw":1700468144,"start_date":"20\/Nov\/2023 08:11:44","end_date_raw":1700532877,"end_date":"21\/Nov\/2023 02:11:37","description":"Illo atque dolores eligendi minus et ut consequuntur.","billable":false,"duration":64733},{"start_date_raw":1700533177,"start_date":"21\/Nov\/2023 02:11:37","end_date_raw":1700619369,"end_date":"22\/Nov\/2023 02:11:09","description":"Libero ipsa eligendi sit dolor eligendi quibusdam dicta tenetur.","billable":false,"duration":86192},{"start_date_raw":1700619669,"start_date":"22\/Nov\/2023 02:11:09","end_date_raw":1700646879,"end_date":"22\/Nov\/2023 09:11:39","description":"Dolor unde assumenda blanditiis tenetur blanditiis ipsam quis.","billable":true,"duration":27210},{"start_date_raw":1700647179,"start_date":"22\/Nov\/2023 09:11:39","end_date_raw":1700704537,"end_date":"23\/Nov\/2023 01:11:37","description":"Reprehenderit possimus nisi recusandae.","billable":true,"duration":57358},{"start_date_raw":1700704837,"start_date":"23\/Nov\/2023 02:11:37","end_date_raw":1700733175,"end_date":"23\/Nov\/2023 09:11:55","description":"Aut saepe sint qui magni.","billable":false,"duration":28338},{"start_date_raw":1700733475,"start_date":"23\/Nov\/2023 09:11:55","end_date_raw":1700735626,"end_date":"23\/Nov\/2023 10:11:46","description":"Facere repellendus voluptas illo a.","billable":true,"duration":2151},{"start_date_raw":1700735926,"start_date":"23\/Nov\/2023 10:11:46","end_date_raw":1700769798,"end_date":"23\/Nov\/2023 20:11:18","description":"Voluptatem praesentium ipsum soluta earum.","billable":false,"duration":33872},{"start_date_raw":1700770098,"start_date":"23\/Nov\/2023 20:11:18","end_date_raw":1700818386,"end_date":"24\/Nov\/2023 09:11:06","description":"Dicta eum quis dicta quae.","billable":true,"duration":48288}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Medhurst Inc","balance":"37633.780000","payment_balance":"0.000000","credit_balance":"1025.100000"}}],"client":{"name":"Medhurst Inc","balance":"37633.780000","payment_balance":"0.000000","credit_balance":"1025.100000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}}]'; + public string $project_data = '[{"name":"Abel Moore","number":"0001","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$107.00","task_rate_raw":"107.000000","due_date":"25\/Nov\/2023","private_notes":"","public_notes":"Omnis modi optio maxime ut inventore.","budgeted_hours":339,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":390,"tasks":[{"number":"0002","description":"Et dolorem nihil qui quas asperiores nulla aut praesentium. Ea quasi porro facere eligendi. Et assumenda illum nostrum natus repellat eveniet. Sequi odio nulla perspiciatis doloremque.","duration":966982,"rate":"$76.00","rate_raw":"76.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428466,"start_date":"19\/Nov\/2023 21:11:26","end_date_raw":1700492035,"end_date":"20\/Nov\/2023 14:11:55","description":"Nihil voluptas et sint et.","billable":true,"duration":63569},{"start_date_raw":1700492335,"start_date":"20\/Nov\/2023 14:11:55","end_date_raw":1700554011,"end_date":"21\/Nov\/2023 08:11:51","description":"Aut consequuntur aliquam earum aut reiciendis.","billable":false,"duration":61676},{"start_date_raw":1700554311,"start_date":"21\/Nov\/2023 08:11:51","end_date_raw":1700586651,"end_date":"21\/Nov\/2023 17:11:51","description":"Occaecati consectetur temporibus neque rerum sed rem iure.","billable":true,"duration":32340},{"start_date_raw":1700586951,"start_date":"21\/Nov\/2023 17:11:51","end_date_raw":1700644903,"end_date":"22\/Nov\/2023 09:11:43","description":"Ducimus voluptate aliquid aliquam nobis.","billable":true,"duration":57952},{"start_date_raw":1700645203,"start_date":"22\/Nov\/2023 09:11:43","end_date_raw":1700724132,"end_date":"23\/Nov\/2023 07:11:12","description":"Non ipsam consequatur voluptatem illum.","billable":true,"duration":78929},{"start_date_raw":1700724432,"start_date":"23\/Nov\/2023 07:11:12","end_date_raw":1700790596,"end_date":"24\/Nov\/2023 01:11:56","description":"Aspernatur quia voluptate molestias non.","billable":false,"duration":66164},{"start_date_raw":1700790896,"start_date":"24\/Nov\/2023 01:11:56","end_date_raw":1700812808,"end_date":"24\/Nov\/2023 08:11:08","description":"Sed quod omnis officiis asperiores natus facere minus nemo.","billable":false,"duration":21912},{"start_date_raw":1700813108,"start_date":"24\/Nov\/2023 08:11:08","end_date_raw":1700865275,"end_date":"24\/Nov\/2023 22:11:35","description":"Tenetur quaerat ea magni placeat.","billable":false,"duration":52167},{"start_date_raw":1700865575,"start_date":"24\/Nov\/2023 22:11:35","end_date_raw":1700888516,"end_date":"25\/Nov\/2023 05:11:56","description":"Sequi dolor laborum deserunt rerum.","billable":true,"duration":22941},{"start_date_raw":1700888816,"start_date":"25\/Nov\/2023 05:11:56","end_date_raw":1700933259,"end_date":"25\/Nov\/2023 17:11:39","description":"Est qui velit ipsum et nesciunt qui ut.","billable":true,"duration":44443},{"start_date_raw":1700933559,"start_date":"25\/Nov\/2023 17:11:39","end_date_raw":1700979107,"end_date":"26\/Nov\/2023 06:11:47","description":"Sint et quo quo.","billable":false,"duration":45548},{"start_date_raw":1700979407,"start_date":"26\/Nov\/2023 06:11:47","end_date_raw":1701002669,"end_date":"26\/Nov\/2023 12:11:29","description":"Omnis unde sit similique dolor fugit totam.","billable":true,"duration":23262},{"start_date_raw":1701002969,"start_date":"26\/Nov\/2023 12:11:29","end_date_raw":1701071339,"end_date":"27\/Nov\/2023 07:11:59","description":"Ducimus qui voluptas accusamus.","billable":true,"duration":68370},{"start_date_raw":1701071639,"start_date":"27\/Nov\/2023 07:11:59","end_date_raw":1701100825,"end_date":"27\/Nov\/2023 16:11:25","description":"Soluta sit non nobis ab et ad libero sint.","billable":false,"duration":29186},{"start_date_raw":1701101125,"start_date":"27\/Nov\/2023 16:11:25","end_date_raw":1701157799,"end_date":"28\/Nov\/2023 07:11:59","description":"Cumque dignissimos error qui ut.","billable":true,"duration":56674},{"start_date_raw":1701158099,"start_date":"28\/Nov\/2023 07:11:59","end_date_raw":1701214020,"end_date":"28\/Nov\/2023 23:11:00","description":"Molestias omnis aliquid voluptatem cupiditate ut.","billable":true,"duration":55921},{"start_date_raw":1701214320,"start_date":"28\/Nov\/2023 23:11:00","end_date_raw":1701286375,"end_date":"29\/Nov\/2023 19:11:55","description":"Distinctio commodi est ab.","billable":true,"duration":72055},{"start_date_raw":1701286675,"start_date":"29\/Nov\/2023 19:11:55","end_date_raw":1701330081,"end_date":"30\/Nov\/2023 07:11:21","description":"Nisi dolores omnis veritatis.","billable":false,"duration":43406},{"start_date_raw":1701330381,"start_date":"30\/Nov\/2023 07:11:21","end_date_raw":1701398228,"end_date":"01\/Dec\/2023 02:12:08","description":"Qui aut velit quam dolore qui asperiores.","billable":false,"duration":67847},{"start_date_raw":1701398528,"start_date":"01\/Dec\/2023 02:12:08","end_date_raw":1701401148,"end_date":"01\/Dec\/2023 03:12:48","description":"Laudantium est laudantium ea ut repellendus.","billable":true,"duration":2620}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000","vat_number":"VAT123"}},{"number":"0003","description":"Qui excepturi et aut et voluptates eius perferendis. Repellat eum illo quis aliquid occaecati reprehenderit officia. Est earum nihil similique recusandae aut ut est error. Enim molestiae assumenda quaerat neque unde. Consequatur vel placeat commodi molestiae.","duration":259657,"rate":"$9.00","rate_raw":"9.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428466,"start_date":"19\/Nov\/2023 21:11:26","end_date_raw":1700498928,"end_date":"20\/Nov\/2023 16:11:48","description":"Animi asperiores velit quaerat sapiente dolorem officiis.","billable":false,"duration":70462},{"start_date_raw":1700499228,"start_date":"20\/Nov\/2023 16:11:48","end_date_raw":1700516753,"end_date":"20\/Nov\/2023 21:11:53","description":"Et facere ut tempora similique et sunt culpa.","billable":false,"duration":17525},{"start_date_raw":1700517053,"start_date":"20\/Nov\/2023 21:11:53","end_date_raw":1700523921,"end_date":"20\/Nov\/2023 23:11:21","description":"Consequatur enim non reprehenderit quia.","billable":false,"duration":6868},{"start_date_raw":1700524221,"start_date":"20\/Nov\/2023 23:11:21","end_date_raw":1700609374,"end_date":"21\/Nov\/2023 23:11:34","description":"Nobis non nesciunt ut reprehenderit at.","billable":false,"duration":85153},{"start_date_raw":1700609674,"start_date":"21\/Nov\/2023 23:11:34","end_date_raw":1700689323,"end_date":"22\/Nov\/2023 21:11:03","description":"Blanditiis repellendus quo voluptatum eveniet iste.","billable":false,"duration":79649}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Ready to do","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000","vat_number":"VAT123"}},{"number":"0004","description":"Ipsam tempora id vero perferendis. Nulla laudantium iste qui quod et voluptatem. Aliquam et vel est minus ratione.","duration":179131,"rate":"$146.00","rate_raw":"146.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428466,"start_date":"19\/Nov\/2023 21:11:26","end_date_raw":1700446786,"end_date":"20\/Nov\/2023 02:11:46","description":"Ipsam voluptatum sed officiis eos quo.","billable":true,"duration":18320},{"start_date_raw":1700447086,"start_date":"20\/Nov\/2023 02:11:46","end_date_raw":1700520087,"end_date":"20\/Nov\/2023 22:11:27","description":"Et maxime rem provident veritatis.","billable":true,"duration":73001},{"start_date_raw":1700520387,"start_date":"20\/Nov\/2023 22:11:27","end_date_raw":1700603783,"end_date":"21\/Nov\/2023 21:11:23","description":"Deserunt soluta dolorem harum voluptas necessitatibus eum laborum omnis.","billable":false,"duration":83396},{"start_date_raw":1700604083,"start_date":"21\/Nov\/2023 22:11:23","end_date_raw":1700608497,"end_date":"21\/Nov\/2023 23:11:57","description":"Esse et aperiam nobis dolor voluptas.","billable":true,"duration":4414}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000","vat_number":"VAT123"}}],"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000","vat_number":"VAT123"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},{"name":"Prof. Noah Jaskolski II","number":"0002","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$52.00","task_rate_raw":"52.000000","due_date":"25\/Nov\/2023","private_notes":"","public_notes":"Mollitia ut vel quam. Quia et aut minus.","budgeted_hours":660,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":57,"tasks":[{"number":"0006","description":"Dolor quidem aperiam rerum. Voluptates aut vel ut consequatur. Nam et unde cupiditate qui voluptates voluptatum. Temporibus assumenda enim nam neque.","duration":156986,"rate":"$92.00","rate_raw":"92.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428467,"start_date":"19\/Nov\/2023 21:11:27","end_date_raw":1700443047,"end_date":"20\/Nov\/2023 01:11:27","description":"Unde sequi dicta corporis odio.","billable":true,"duration":14580},{"start_date_raw":1700443347,"start_date":"20\/Nov\/2023 01:11:27","end_date_raw":1700489146,"end_date":"20\/Nov\/2023 14:11:46","description":"Qui rem id inventore velit corporis vitae.","billable":false,"duration":45799},{"start_date_raw":1700489446,"start_date":"20\/Nov\/2023 14:11:46","end_date_raw":1700514655,"end_date":"20\/Nov\/2023 21:11:55","description":"Rerum repellat unde et blanditiis sunt animi aliquid accusantium.","billable":false,"duration":25209},{"start_date_raw":1700514955,"start_date":"20\/Nov\/2023 21:11:55","end_date_raw":1700515449,"end_date":"20\/Nov\/2023 21:11:09","description":"Quasi velit sit et explicabo quibusdam nam.","billable":true,"duration":494},{"start_date_raw":1700515749,"start_date":"20\/Nov\/2023 21:11:09","end_date_raw":1700586653,"end_date":"21\/Nov\/2023 17:11:53","description":"Numquam eos aut eum est corrupti dolorem et.","billable":false,"duration":70904}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Ready to do","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"cypress","balance":"13866.150000","payment_balance":"0.000000","credit_balance":"1013.630000","vat_number":"VAT123"}},{"number":"0007","description":"Omnis totam eum sed dolores quod rerum. Ducimus voluptate iste quia dolorum consequatur sint. Velit vitae sint qui molestias. Dolores ea rerum voluptates iusto qui natus beatae.","duration":47670,"rate":"$88.00","rate_raw":"88.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428467,"start_date":"19\/Nov\/2023 21:11:27","end_date_raw":1700476137,"end_date":"20\/Nov\/2023 10:11:57","description":"Sint laudantium quia eveniet quod nobis occaecati nihil.","billable":false,"duration":47670}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"cypress","balance":"13866.150000","payment_balance":"0.000000","credit_balance":"1013.630000","vat_number":"VAT123"}}],"client":{"name":"cypress","balance":"13866.150000","payment_balance":"0.000000","credit_balance":"1013.630000","vat_number":"VAT123"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},{"name":"Mr. Easton Streich","number":"0003","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$153.00","task_rate_raw":"153.000000","due_date":"28\/Nov\/2023","private_notes":"","public_notes":"Debitis sit ut voluptatem eaque veritatis.","budgeted_hours":216,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":496,"tasks":[{"number":"0009","description":"Ipsam numquam nesciunt corporis veritatis vitae porro maiores. Delectus sit itaque dolores. Atque et dolorem nisi est.","duration":439161,"rate":"$120.00","rate_raw":"120.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700434593,"end_date":"19\/Nov\/2023 22:11:33","description":"At unde dolores quasi quia.","billable":true,"duration":6125},{"start_date_raw":1700434893,"start_date":"19\/Nov\/2023 23:11:33","end_date_raw":1700498703,"end_date":"20\/Nov\/2023 16:11:03","description":"Et quae non voluptatum nam quia velit suscipit.","billable":false,"duration":63810},{"start_date_raw":1700499003,"start_date":"20\/Nov\/2023 16:11:03","end_date_raw":1700548104,"end_date":"21\/Nov\/2023 06:11:24","description":"Quidem delectus sed et.","billable":true,"duration":49101},{"start_date_raw":1700548404,"start_date":"21\/Nov\/2023 06:11:24","end_date_raw":1700629022,"end_date":"22\/Nov\/2023 04:11:02","description":"Soluta velit enim explicabo dolorem commodi.","billable":false,"duration":80618},{"start_date_raw":1700629322,"start_date":"22\/Nov\/2023 05:11:02","end_date_raw":1700647716,"end_date":"22\/Nov\/2023 10:11:36","description":"Est magni qui quis.","billable":false,"duration":18394},{"start_date_raw":1700648016,"start_date":"22\/Nov\/2023 10:11:36","end_date_raw":1700731147,"end_date":"23\/Nov\/2023 09:11:07","description":"Saepe aspernatur non molestias dolor ea quos in.","billable":false,"duration":83131},{"start_date_raw":1700731447,"start_date":"23\/Nov\/2023 09:11:07","end_date_raw":1700782753,"end_date":"23\/Nov\/2023 23:11:13","description":"Alias id nihil laboriosam aliquam odio qui excepturi.","billable":true,"duration":51306},{"start_date_raw":1700783053,"start_date":"23\/Nov\/2023 23:11:13","end_date_raw":1700795456,"end_date":"24\/Nov\/2023 03:11:56","description":"Eos numquam et atque quia a qui nesciunt.","billable":false,"duration":12403},{"start_date_raw":1700795756,"start_date":"24\/Nov\/2023 03:11:56","end_date_raw":1700812488,"end_date":"24\/Nov\/2023 07:11:48","description":"Ut voluptas in natus qui.","billable":false,"duration":16732},{"start_date_raw":1700812788,"start_date":"24\/Nov\/2023 07:11:48","end_date_raw":1700842826,"end_date":"24\/Nov\/2023 16:11:26","description":"Est aut magnam ratione.","billable":false,"duration":30038},{"start_date_raw":1700843126,"start_date":"24\/Nov\/2023 16:11:26","end_date_raw":1700870629,"end_date":"25\/Nov\/2023 00:11:49","description":"Exercitationem non odio quasi ut saepe.","billable":true,"duration":27503}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000","vat_number":"VAT123"}},{"number":"0010","description":"Quo recusandae optio est saepe consectetur optio. Accusantium eum quia eaque. Voluptatum eligendi similique velit dolor eos rerum cumque quaerat.","duration":425934,"rate":"$98.00","rate_raw":"98.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700463790,"end_date":"20\/Nov\/2023 07:11:10","description":"Culpa aut consequatur earum ut.","billable":false,"duration":35322},{"start_date_raw":1700464090,"start_date":"20\/Nov\/2023 07:11:10","end_date_raw":1700536862,"end_date":"21\/Nov\/2023 03:11:02","description":"Reprehenderit et esse qui hic quia est iusto.","billable":false,"duration":72772},{"start_date_raw":1700537162,"start_date":"21\/Nov\/2023 03:11:02","end_date_raw":1700592394,"end_date":"21\/Nov\/2023 18:11:34","description":"In est enim dolore nesciunt distinctio magni qui.","billable":true,"duration":55232},{"start_date_raw":1700592694,"start_date":"21\/Nov\/2023 18:11:34","end_date_raw":1700635771,"end_date":"22\/Nov\/2023 06:11:31","description":"Est saepe quasi alias aut odit officiis corporis.","billable":true,"duration":43077},{"start_date_raw":1700636071,"start_date":"22\/Nov\/2023 06:11:31","end_date_raw":1700637953,"end_date":"22\/Nov\/2023 07:11:53","description":"Consequuntur ipsa ut voluptate accusamus quibusdam sint sed.","billable":false,"duration":1882},{"start_date_raw":1700638253,"start_date":"22\/Nov\/2023 07:11:53","end_date_raw":1700687668,"end_date":"22\/Nov\/2023 21:11:28","description":"Sunt similique error et nostrum reprehenderit dolor.","billable":false,"duration":49415},{"start_date_raw":1700687968,"start_date":"22\/Nov\/2023 21:11:28","end_date_raw":1700712068,"end_date":"23\/Nov\/2023 04:11:08","description":"Aut rerum quis fugiat nostrum facilis ut.","billable":false,"duration":24100},{"start_date_raw":1700712368,"start_date":"23\/Nov\/2023 04:11:08","end_date_raw":1700783951,"end_date":"23\/Nov\/2023 23:11:11","description":"Aut culpa omnis sint et quos quisquam sint.","billable":true,"duration":71583},{"start_date_raw":1700784251,"start_date":"24\/Nov\/2023 00:11:11","end_date_raw":1700845166,"end_date":"24\/Nov\/2023 16:11:26","description":"Voluptas ut ratione porro eaque iste voluptas.","billable":true,"duration":60915},{"start_date_raw":1700845466,"start_date":"24\/Nov\/2023 17:11:26","end_date_raw":1700857102,"end_date":"24\/Nov\/2023 20:11:22","description":"Qui ipsa minus sed saepe maiores necessitatibus.","billable":true,"duration":11636}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Done","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000","vat_number":"VAT123"}},{"number":"0011","description":"Eligendi molestiae et quis et tempora esse ut. Sed ut est possimus et minus aut incidunt. Quibusdam rerum incidunt molestias est qui quam temporibus fuga.","duration":637522,"rate":"$120.00","rate_raw":"120.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700499282,"end_date":"20\/Nov\/2023 16:11:42","description":"Quasi temporibus doloremque consequatur minus pariatur facere.","billable":true,"duration":70814},{"start_date_raw":1700499582,"start_date":"20\/Nov\/2023 16:11:42","end_date_raw":1700584386,"end_date":"21\/Nov\/2023 16:11:06","description":"Id distinctio sed eos qui.","billable":true,"duration":84804},{"start_date_raw":1700584686,"start_date":"21\/Nov\/2023 16:11:06","end_date_raw":1700635554,"end_date":"22\/Nov\/2023 06:11:54","description":"Facere explicabo non nostrum.","billable":true,"duration":50868},{"start_date_raw":1700635854,"start_date":"22\/Nov\/2023 06:11:54","end_date_raw":1700672533,"end_date":"22\/Nov\/2023 17:11:13","description":"Numquam sit labore facere voluptatibus quibusdam reiciendis et.","billable":true,"duration":36679},{"start_date_raw":1700672833,"start_date":"22\/Nov\/2023 17:11:13","end_date_raw":1700678587,"end_date":"22\/Nov\/2023 18:11:07","description":"Perspiciatis ad hic nostrum et.","billable":true,"duration":5754},{"start_date_raw":1700678887,"start_date":"22\/Nov\/2023 18:11:07","end_date_raw":1700708730,"end_date":"23\/Nov\/2023 03:11:30","description":"Qui culpa iure eos quaerat voluptatum numquam inventore.","billable":true,"duration":29843},{"start_date_raw":1700709030,"start_date":"23\/Nov\/2023 03:11:30","end_date_raw":1700765439,"end_date":"23\/Nov\/2023 18:11:39","description":"Similique molestiae atque voluptatem debitis dolorem quos quis et.","billable":false,"duration":56409},{"start_date_raw":1700765739,"start_date":"23\/Nov\/2023 18:11:39","end_date_raw":1700831780,"end_date":"24\/Nov\/2023 13:11:20","description":"Nam dolorum optio et omnis.","billable":true,"duration":66041},{"start_date_raw":1700832080,"start_date":"24\/Nov\/2023 13:11:20","end_date_raw":1700844498,"end_date":"24\/Nov\/2023 16:11:18","description":"Non eos amet repellat tempore id.","billable":false,"duration":12418},{"start_date_raw":1700844798,"start_date":"24\/Nov\/2023 16:11:18","end_date_raw":1700899153,"end_date":"25\/Nov\/2023 07:11:13","description":"Iste neque nostrum laudantium officia.","billable":false,"duration":54355},{"start_date_raw":1700899453,"start_date":"25\/Nov\/2023 08:11:13","end_date_raw":1700971949,"end_date":"26\/Nov\/2023 04:11:29","description":"Ut quia ratione sed et.","billable":true,"duration":72496},{"start_date_raw":1700972249,"start_date":"26\/Nov\/2023 04:11:29","end_date_raw":1700984833,"end_date":"26\/Nov\/2023 07:11:13","description":"Sapiente quia magni quisquam eos rerum rem.","billable":false,"duration":12584},{"start_date_raw":1700985133,"start_date":"26\/Nov\/2023 07:11:13","end_date_raw":1701069590,"end_date":"27\/Nov\/2023 07:11:50","description":"Nulla et ducimus doloribus est.","billable":true,"duration":84457}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Done","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000","vat_number":"VAT123"}},{"number":"0012","description":"Ea cumque amet quas et suscipit. Voluptatum libero enim minus necessitatibus qui voluptatem. Voluptates soluta quae in et aut possimus veniam.","duration":283580,"rate":"$78.00","rate_raw":"78.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700469690,"end_date":"20\/Nov\/2023 08:11:30","description":"Placeat vel sit voluptas architecto sed.","billable":true,"duration":41222},{"start_date_raw":1700469990,"start_date":"20\/Nov\/2023 08:11:30","end_date_raw":1700483859,"end_date":"20\/Nov\/2023 12:11:39","description":"Voluptatem est quo est dolorem.","billable":true,"duration":13869},{"start_date_raw":1700484159,"start_date":"20\/Nov\/2023 12:11:39","end_date_raw":1700541376,"end_date":"21\/Nov\/2023 04:11:16","description":"Perferendis nulla quos omnis inventore sint.","billable":false,"duration":57217},{"start_date_raw":1700541676,"start_date":"21\/Nov\/2023 04:11:16","end_date_raw":1700609280,"end_date":"21\/Nov\/2023 23:11:00","description":"Quia quae ad cum neque.","billable":true,"duration":67604},{"start_date_raw":1700609580,"start_date":"21\/Nov\/2023 23:11:00","end_date_raw":1700668490,"end_date":"22\/Nov\/2023 15:11:50","description":"Pariatur et ipsa cumque consequatur voluptatum nemo.","billable":true,"duration":58910},{"start_date_raw":1700668790,"start_date":"22\/Nov\/2023 15:11:50","end_date_raw":1700690815,"end_date":"22\/Nov\/2023 22:11:55","description":"Officia explicabo illo ex tenetur.","billable":true,"duration":22025},{"start_date_raw":1700691115,"start_date":"22\/Nov\/2023 22:11:55","end_date_raw":1700713848,"end_date":"23\/Nov\/2023 04:11:48","description":"Quasi neque tempore aut at.","billable":true,"duration":22733}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Ready to do","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000","vat_number":"VAT123"}}],"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000","vat_number":"VAT123"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},{"name":"Elenor Orn","number":"0004","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$39.00","task_rate_raw":"39.000000","due_date":"27\/Nov\/2023","private_notes":"","public_notes":"Distinctio ut voluptas deleniti est sed quae.","budgeted_hours":372,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":331,"tasks":[{"number":"0014","description":"In soluta aliquid et eius. Molestiae veritatis animi culpa et amet porro modi ut. Id sequi nobis itaque modi explicabo voluptatem quam. Non ex voluptatem error aspernatur odit.","duration":346244,"rate":"$70.00","rate_raw":"70.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700458211,"end_date":"20\/Nov\/2023 05:11:11","description":"Voluptate aut dicta recusandae consectetur est ducimus.","billable":false,"duration":29743},{"start_date_raw":1700458511,"start_date":"20\/Nov\/2023 05:11:11","end_date_raw":1700516247,"end_date":"20\/Nov\/2023 21:11:27","description":"Dolores incidunt praesentium rerum.","billable":false,"duration":57736},{"start_date_raw":1700516547,"start_date":"20\/Nov\/2023 21:11:27","end_date_raw":1700549251,"end_date":"21\/Nov\/2023 06:11:31","description":"Perspiciatis consequatur et alias praesentium placeat modi aut.","billable":true,"duration":32704},{"start_date_raw":1700549551,"start_date":"21\/Nov\/2023 06:11:31","end_date_raw":1700618445,"end_date":"22\/Nov\/2023 02:11:45","description":"Esse libero incidunt non rem sunt quisquam repudiandae nisi.","billable":true,"duration":68894},{"start_date_raw":1700618745,"start_date":"22\/Nov\/2023 02:11:45","end_date_raw":1700698086,"end_date":"23\/Nov\/2023 00:11:06","description":"Earum consectetur esse fugit sint autem tempore.","billable":true,"duration":79341},{"start_date_raw":1700698386,"start_date":"23\/Nov\/2023 00:11:06","end_date_raw":1700776212,"end_date":"23\/Nov\/2023 21:11:12","description":"Saepe sit consequatur vel eos ad iusto nobis.","billable":true,"duration":77826}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Ready to do","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000","vat_number":"VAT123"}},{"number":"0015","description":"Minus accusamus illum quia nihil voluptatum qui mollitia vel. Natus fugiat sequi quod eius occaecati non. Minus rerum ut eos est eveniet quae iure.","duration":410859,"rate":"$13.00","rate_raw":"13.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700506053,"end_date":"20\/Nov\/2023 18:11:33","description":"Iste neque officiis eum maiores.","billable":true,"duration":77585},{"start_date_raw":1700506353,"start_date":"20\/Nov\/2023 18:11:33","end_date_raw":1700572042,"end_date":"21\/Nov\/2023 13:11:22","description":"Minus perferendis quia amet.","billable":true,"duration":65689},{"start_date_raw":1700572342,"start_date":"21\/Nov\/2023 13:11:22","end_date_raw":1700637291,"end_date":"22\/Nov\/2023 07:11:51","description":"Commodi quaerat hic minus et voluptas velit.","billable":true,"duration":64949},{"start_date_raw":1700637591,"start_date":"22\/Nov\/2023 07:11:51","end_date_raw":1700649610,"end_date":"22\/Nov\/2023 10:11:10","description":"Vitae rerum natus aperiam quia explicabo.","billable":false,"duration":12019},{"start_date_raw":1700649910,"start_date":"22\/Nov\/2023 10:11:10","end_date_raw":1700693674,"end_date":"22\/Nov\/2023 22:11:34","description":"Quos sunt dolorum eveniet provident ut.","billable":false,"duration":43764},{"start_date_raw":1700693974,"start_date":"22\/Nov\/2023 22:11:34","end_date_raw":1700775335,"end_date":"23\/Nov\/2023 21:11:35","description":"Animi quibusdam quisquam ea error earum consectetur.","billable":true,"duration":81361},{"start_date_raw":1700775635,"start_date":"23\/Nov\/2023 21:11:35","end_date_raw":1700808126,"end_date":"24\/Nov\/2023 06:11:06","description":"Ratione ipsam molestiae dolorem sit architecto voluptas.","billable":true,"duration":32491},{"start_date_raw":1700808426,"start_date":"24\/Nov\/2023 06:11:06","end_date_raw":1700817758,"end_date":"24\/Nov\/2023 09:11:38","description":"Maxime reprehenderit voluptates culpa.","billable":false,"duration":9332},{"start_date_raw":1700818058,"start_date":"24\/Nov\/2023 09:11:38","end_date_raw":1700841727,"end_date":"24\/Nov\/2023 16:11:07","description":"Atque deleniti et laboriosam molestias repellat accusamus omnis.","billable":false,"duration":23669}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000","vat_number":"VAT123"}},{"number":"0016","description":"Temporibus illum voluptatibus molestias quia omnis illo molestias corporis. Hic et hic quia dolores quas sint dolorem. Repellendus minus quae fuga illum amet in voluptatum. Rerum mollitia est eum voluptatum architecto non nisi qui. Est et dolores omnis placeat repellat sed facilis.","duration":435319,"rate":"$89.00","rate_raw":"89.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428469,"start_date":"19\/Nov\/2023 21:11:29","end_date_raw":1700496403,"end_date":"20\/Nov\/2023 16:11:43","description":"Sunt unde repellat reiciendis quos porro et dolores.","billable":true,"duration":67934},{"start_date_raw":1700496703,"start_date":"20\/Nov\/2023 16:11:43","end_date_raw":1700551129,"end_date":"21\/Nov\/2023 07:11:49","description":"Voluptatem laborum repudiandae enim asperiores.","billable":false,"duration":54426},{"start_date_raw":1700551429,"start_date":"21\/Nov\/2023 07:11:49","end_date_raw":1700631865,"end_date":"22\/Nov\/2023 05:11:25","description":"Placeat numquam magnam occaecati.","billable":false,"duration":80436},{"start_date_raw":1700632165,"start_date":"22\/Nov\/2023 05:11:25","end_date_raw":1700695854,"end_date":"22\/Nov\/2023 23:11:54","description":"Qui quo et est vero autem reprehenderit.","billable":false,"duration":63689},{"start_date_raw":1700696154,"start_date":"22\/Nov\/2023 23:11:54","end_date_raw":1700736857,"end_date":"23\/Nov\/2023 10:11:17","description":"Et voluptatem distinctio dolor fuga hic ea.","billable":false,"duration":40703},{"start_date_raw":1700737157,"start_date":"23\/Nov\/2023 10:11:17","end_date_raw":1700790692,"end_date":"24\/Nov\/2023 01:11:32","description":"Quo expedita quidem ab dolor quam expedita porro.","billable":true,"duration":53535},{"start_date_raw":1700790992,"start_date":"24\/Nov\/2023 01:11:32","end_date_raw":1700817527,"end_date":"24\/Nov\/2023 09:11:47","description":"Adipisci voluptatem officiis quaerat ut quos facilis.","billable":false,"duration":26535},{"start_date_raw":1700817827,"start_date":"24\/Nov\/2023 09:11:47","end_date_raw":1700865888,"end_date":"24\/Nov\/2023 22:11:48","description":"Tenetur ut dolorem vero.","billable":true,"duration":48061}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Done","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000","vat_number":"VAT123"}}],"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000","vat_number":"VAT123"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},{"name":"Maryjane Macejkovic","number":"0005","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$78.00","task_rate_raw":"78.000000","due_date":"26\/Nov\/2023","private_notes":"","public_notes":"Nesciunt est sit ea explicabo.","budgeted_hours":405,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":194,"tasks":[{"number":"0018","description":"Odit rerum iusto quibusdam. A mollitia cupiditate enim consequatur omnis qui voluptas quibusdam. Recusandae et non ut ipsum asperiores non iusto.","duration":312865,"rate":"$95.00","rate_raw":"95.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428469,"start_date":"19\/Nov\/2023 21:11:29","end_date_raw":1700476677,"end_date":"20\/Nov\/2023 10:11:57","description":"Quam dolores ut dolorem quo sint atque.","billable":true,"duration":48208},{"start_date_raw":1700476977,"start_date":"20\/Nov\/2023 10:11:57","end_date_raw":1700520944,"end_date":"20\/Nov\/2023 22:11:44","description":"Unde minus veniam corporis qui laboriosam suscipit quas.","billable":true,"duration":43967},{"start_date_raw":1700521244,"start_date":"20\/Nov\/2023 23:11:44","end_date_raw":1700602639,"end_date":"21\/Nov\/2023 21:11:19","description":"Beatae molestiae molestias sed dolor recusandae et id eligendi.","billable":false,"duration":81395},{"start_date_raw":1700602939,"start_date":"21\/Nov\/2023 21:11:19","end_date_raw":1700682077,"end_date":"22\/Nov\/2023 19:11:17","description":"Repellendus nam perspiciatis exercitationem in iste officia.","billable":true,"duration":79138},{"start_date_raw":1700682377,"start_date":"22\/Nov\/2023 19:11:17","end_date_raw":1700692054,"end_date":"22\/Nov\/2023 22:11:34","description":"Consequatur quaerat dolor consequuntur aperiam enim reiciendis.","billable":true,"duration":9677},{"start_date_raw":1700692354,"start_date":"22\/Nov\/2023 22:11:34","end_date_raw":1700742834,"end_date":"23\/Nov\/2023 12:11:54","description":"Qui quia ut sed accusantium odit reprehenderit quaerat.","billable":true,"duration":50480}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Medhurst Inc","balance":"37633.780000","payment_balance":"0.000000","credit_balance":"1025.100000","vat_number":"VAT123"}},{"number":"0019","description":"Eius et dolor libero repellendus iste. Nemo sit error sed necessitatibus architecto et. Aspernatur omnis doloremque animi quas sed.","duration":387217,"rate":"$87.00","rate_raw":"87.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428469,"start_date":"19\/Nov\/2023 21:11:29","end_date_raw":1700434042,"end_date":"19\/Nov\/2023 22:11:22","description":"Aut aliquam totam in reprehenderit sint suscipit earum.","billable":false,"duration":5573},{"start_date_raw":1700434342,"start_date":"19\/Nov\/2023 22:11:22","end_date_raw":1700467844,"end_date":"20\/Nov\/2023 08:11:44","description":"Hic aliquid natus est.","billable":false,"duration":33502},{"start_date_raw":1700468144,"start_date":"20\/Nov\/2023 08:11:44","end_date_raw":1700532877,"end_date":"21\/Nov\/2023 02:11:37","description":"Illo atque dolores eligendi minus et ut consequuntur.","billable":false,"duration":64733},{"start_date_raw":1700533177,"start_date":"21\/Nov\/2023 02:11:37","end_date_raw":1700619369,"end_date":"22\/Nov\/2023 02:11:09","description":"Libero ipsa eligendi sit dolor eligendi quibusdam dicta tenetur.","billable":false,"duration":86192},{"start_date_raw":1700619669,"start_date":"22\/Nov\/2023 02:11:09","end_date_raw":1700646879,"end_date":"22\/Nov\/2023 09:11:39","description":"Dolor unde assumenda blanditiis tenetur blanditiis ipsam quis.","billable":true,"duration":27210},{"start_date_raw":1700647179,"start_date":"22\/Nov\/2023 09:11:39","end_date_raw":1700704537,"end_date":"23\/Nov\/2023 01:11:37","description":"Reprehenderit possimus nisi recusandae.","billable":true,"duration":57358},{"start_date_raw":1700704837,"start_date":"23\/Nov\/2023 02:11:37","end_date_raw":1700733175,"end_date":"23\/Nov\/2023 09:11:55","description":"Aut saepe sint qui magni.","billable":false,"duration":28338},{"start_date_raw":1700733475,"start_date":"23\/Nov\/2023 09:11:55","end_date_raw":1700735626,"end_date":"23\/Nov\/2023 10:11:46","description":"Facere repellendus voluptas illo a.","billable":true,"duration":2151},{"start_date_raw":1700735926,"start_date":"23\/Nov\/2023 10:11:46","end_date_raw":1700769798,"end_date":"23\/Nov\/2023 20:11:18","description":"Voluptatem praesentium ipsum soluta earum.","billable":false,"duration":33872},{"start_date_raw":1700770098,"start_date":"23\/Nov\/2023 20:11:18","end_date_raw":1700818386,"end_date":"24\/Nov\/2023 09:11:06","description":"Dicta eum quis dicta quae.","billable":true,"duration":48288}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Medhurst Inc","balance":"37633.780000","payment_balance":"0.000000","credit_balance":"1025.100000","vat_number":"VAT123"}}],"client":{"name":"Medhurst Inc","balance":"37633.780000","payment_balance":"0.000000","credit_balance":"1025.100000","vat_number":"VAT123"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}}]'; - public string $task_data = '[{"number":"0001","description":"Reiciendis itaque molestias blanditiis cupiditate ea. Minus officiis natus itaque. Consectetur et aut veritatis quae ut esse ut. Accusantium dolore quaerat sit qui. Magni quia sunt corporis.","duration":149031,"rate":"$71.00","rate_raw":"71.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428466,"start_date":"19\/Nov\/2023 21:11:26","end_date_raw":1700470150,"end_date":"20\/Nov\/2023 08:11:10","description":"Assumenda nihil vitae odio voluptatem iusto ipsam repellendus.","billable":false,"duration":41684},{"start_date_raw":1700470450,"start_date":"20\/Nov\/2023 08:11:10","end_date_raw":1700485036,"end_date":"20\/Nov\/2023 12:11:16","description":"Adipisci amet optio tempore et.","billable":true,"duration":14586},{"start_date_raw":1700485336,"start_date":"20\/Nov\/2023 13:11:16","end_date_raw":1700572291,"end_date":"21\/Nov\/2023 13:11:31","description":"Ratione repellat saepe mollitia perspiciatis optio.","billable":false,"duration":86955},{"start_date_raw":1700572591,"start_date":"21\/Nov\/2023 13:11:31","end_date_raw":1700578397,"end_date":"21\/Nov\/2023 14:11:17","description":"Molestias perferendis ipsa odit id aut sunt.","billable":true,"duration":5806}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Done","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Medhurst Inc","balance":"37633.780000","payment_balance":"0.000000","credit_balance":"1025.100000"}},{"number":"0002","description":"Et dolorem nihil qui quas asperiores nulla aut praesentium. Ea quasi porro facere eligendi. Et assumenda illum nostrum natus repellat eveniet. Sequi odio nulla perspiciatis doloremque.","duration":966982,"rate":"$76.00","rate_raw":"76.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Abel Moore","number":"0001","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$107.00","task_rate_raw":"107.000000","due_date":"25\/Nov\/2023","private_notes":"","public_notes":"Omnis modi optio maxime ut inventore.","budgeted_hours":339,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":390,"tasks":[],"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428466,"start_date":"19\/Nov\/2023 21:11:26","end_date_raw":1700492035,"end_date":"20\/Nov\/2023 14:11:55","description":"Nihil voluptas et sint et.","billable":true,"duration":63569},{"start_date_raw":1700492335,"start_date":"20\/Nov\/2023 14:11:55","end_date_raw":1700554011,"end_date":"21\/Nov\/2023 08:11:51","description":"Aut consequuntur aliquam earum aut reiciendis.","billable":false,"duration":61676},{"start_date_raw":1700554311,"start_date":"21\/Nov\/2023 08:11:51","end_date_raw":1700586651,"end_date":"21\/Nov\/2023 17:11:51","description":"Occaecati consectetur temporibus neque rerum sed rem iure.","billable":true,"duration":32340},{"start_date_raw":1700586951,"start_date":"21\/Nov\/2023 17:11:51","end_date_raw":1700644903,"end_date":"22\/Nov\/2023 09:11:43","description":"Ducimus voluptate aliquid aliquam nobis.","billable":true,"duration":57952},{"start_date_raw":1700645203,"start_date":"22\/Nov\/2023 09:11:43","end_date_raw":1700724132,"end_date":"23\/Nov\/2023 07:11:12","description":"Non ipsam consequatur voluptatem illum.","billable":true,"duration":78929},{"start_date_raw":1700724432,"start_date":"23\/Nov\/2023 07:11:12","end_date_raw":1700790596,"end_date":"24\/Nov\/2023 01:11:56","description":"Aspernatur quia voluptate molestias non.","billable":false,"duration":66164},{"start_date_raw":1700790896,"start_date":"24\/Nov\/2023 01:11:56","end_date_raw":1700812808,"end_date":"24\/Nov\/2023 08:11:08","description":"Sed quod omnis officiis asperiores natus facere minus nemo.","billable":false,"duration":21912},{"start_date_raw":1700813108,"start_date":"24\/Nov\/2023 08:11:08","end_date_raw":1700865275,"end_date":"24\/Nov\/2023 22:11:35","description":"Tenetur quaerat ea magni placeat.","billable":false,"duration":52167},{"start_date_raw":1700865575,"start_date":"24\/Nov\/2023 22:11:35","end_date_raw":1700888516,"end_date":"25\/Nov\/2023 05:11:56","description":"Sequi dolor laborum deserunt rerum.","billable":true,"duration":22941},{"start_date_raw":1700888816,"start_date":"25\/Nov\/2023 05:11:56","end_date_raw":1700933259,"end_date":"25\/Nov\/2023 17:11:39","description":"Est qui velit ipsum et nesciunt qui ut.","billable":true,"duration":44443},{"start_date_raw":1700933559,"start_date":"25\/Nov\/2023 17:11:39","end_date_raw":1700979107,"end_date":"26\/Nov\/2023 06:11:47","description":"Sint et quo quo.","billable":false,"duration":45548},{"start_date_raw":1700979407,"start_date":"26\/Nov\/2023 06:11:47","end_date_raw":1701002669,"end_date":"26\/Nov\/2023 12:11:29","description":"Omnis unde sit similique dolor fugit totam.","billable":true,"duration":23262},{"start_date_raw":1701002969,"start_date":"26\/Nov\/2023 12:11:29","end_date_raw":1701071339,"end_date":"27\/Nov\/2023 07:11:59","description":"Ducimus qui voluptas accusamus.","billable":true,"duration":68370},{"start_date_raw":1701071639,"start_date":"27\/Nov\/2023 07:11:59","end_date_raw":1701100825,"end_date":"27\/Nov\/2023 16:11:25","description":"Soluta sit non nobis ab et ad libero sint.","billable":false,"duration":29186},{"start_date_raw":1701101125,"start_date":"27\/Nov\/2023 16:11:25","end_date_raw":1701157799,"end_date":"28\/Nov\/2023 07:11:59","description":"Cumque dignissimos error qui ut.","billable":true,"duration":56674},{"start_date_raw":1701158099,"start_date":"28\/Nov\/2023 07:11:59","end_date_raw":1701214020,"end_date":"28\/Nov\/2023 23:11:00","description":"Molestias omnis aliquid voluptatem cupiditate ut.","billable":true,"duration":55921},{"start_date_raw":1701214320,"start_date":"28\/Nov\/2023 23:11:00","end_date_raw":1701286375,"end_date":"29\/Nov\/2023 19:11:55","description":"Distinctio commodi est ab.","billable":true,"duration":72055},{"start_date_raw":1701286675,"start_date":"29\/Nov\/2023 19:11:55","end_date_raw":1701330081,"end_date":"30\/Nov\/2023 07:11:21","description":"Nisi dolores omnis veritatis.","billable":false,"duration":43406},{"start_date_raw":1701330381,"start_date":"30\/Nov\/2023 07:11:21","end_date_raw":1701398228,"end_date":"01\/Dec\/2023 02:12:08","description":"Qui aut velit quam dolore qui asperiores.","billable":false,"duration":67847},{"start_date_raw":1701398528,"start_date":"01\/Dec\/2023 02:12:08","end_date_raw":1701401148,"end_date":"01\/Dec\/2023 03:12:48","description":"Laudantium est laudantium ea ut repellendus.","billable":true,"duration":2620}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000"}},{"number":"0003","description":"Qui excepturi et aut et voluptates eius perferendis. Repellat eum illo quis aliquid occaecati reprehenderit officia. Est earum nihil similique recusandae aut ut est error. Enim molestiae assumenda quaerat neque unde. Consequatur vel placeat commodi molestiae.","duration":259657,"rate":"$9.00","rate_raw":"9.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Abel Moore","number":"0001","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$107.00","task_rate_raw":"107.000000","due_date":"25\/Nov\/2023","private_notes":"","public_notes":"Omnis modi optio maxime ut inventore.","budgeted_hours":339,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":390,"tasks":[],"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428466,"start_date":"19\/Nov\/2023 21:11:26","end_date_raw":1700498928,"end_date":"20\/Nov\/2023 16:11:48","description":"Animi asperiores velit quaerat sapiente dolorem officiis.","billable":false,"duration":70462},{"start_date_raw":1700499228,"start_date":"20\/Nov\/2023 16:11:48","end_date_raw":1700516753,"end_date":"20\/Nov\/2023 21:11:53","description":"Et facere ut tempora similique et sunt culpa.","billable":false,"duration":17525},{"start_date_raw":1700517053,"start_date":"20\/Nov\/2023 21:11:53","end_date_raw":1700523921,"end_date":"20\/Nov\/2023 23:11:21","description":"Consequatur enim non reprehenderit quia.","billable":false,"duration":6868},{"start_date_raw":1700524221,"start_date":"20\/Nov\/2023 23:11:21","end_date_raw":1700609374,"end_date":"21\/Nov\/2023 23:11:34","description":"Nobis non nesciunt ut reprehenderit at.","billable":false,"duration":85153},{"start_date_raw":1700609674,"start_date":"21\/Nov\/2023 23:11:34","end_date_raw":1700689323,"end_date":"22\/Nov\/2023 21:11:03","description":"Blanditiis repellendus quo voluptatum eveniet iste.","billable":false,"duration":79649}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Ready to do","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000"}},{"number":"0004","description":"Ipsam tempora id vero perferendis. Nulla laudantium iste qui quod et voluptatem. Aliquam et vel est minus ratione.","duration":179131,"rate":"$146.00","rate_raw":"146.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Abel Moore","number":"0001","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$107.00","task_rate_raw":"107.000000","due_date":"25\/Nov\/2023","private_notes":"","public_notes":"Omnis modi optio maxime ut inventore.","budgeted_hours":339,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":390,"tasks":[],"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428466,"start_date":"19\/Nov\/2023 21:11:26","end_date_raw":1700446786,"end_date":"20\/Nov\/2023 02:11:46","description":"Ipsam voluptatum sed officiis eos quo.","billable":true,"duration":18320},{"start_date_raw":1700447086,"start_date":"20\/Nov\/2023 02:11:46","end_date_raw":1700520087,"end_date":"20\/Nov\/2023 22:11:27","description":"Et maxime rem provident veritatis.","billable":true,"duration":73001},{"start_date_raw":1700520387,"start_date":"20\/Nov\/2023 22:11:27","end_date_raw":1700603783,"end_date":"21\/Nov\/2023 21:11:23","description":"Deserunt soluta dolorem harum voluptas necessitatibus eum laborum omnis.","billable":false,"duration":83396},{"start_date_raw":1700604083,"start_date":"21\/Nov\/2023 22:11:23","end_date_raw":1700608497,"end_date":"21\/Nov\/2023 23:11:57","description":"Esse et aperiam nobis dolor voluptas.","billable":true,"duration":4414}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000"}},{"number":"0005","description":"Enim fugiat at excepturi voluptate debitis ea. Hic officiis quaerat molestiae ullam minus consequuntur ut. Officiis quas consequatur error quae eveniet. Dolorum aliquam provident aperiam asperiores alias modi quae a.","duration":3230,"rate":"$78.00","rate_raw":"78.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428467,"start_date":"19\/Nov\/2023 21:11:27","end_date_raw":1700431697,"end_date":"19\/Nov\/2023 22:11:17","description":"Repudiandae nam et consequatur consequatur.","billable":false,"duration":3230}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Done","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Schroeder-Beahan","balance":"60576.340000","payment_balance":"0.000000","credit_balance":"0.000000"}},{"number":"0006","description":"Dolor quidem aperiam rerum. Voluptates aut vel ut consequatur. Nam et unde cupiditate qui voluptates voluptatum. Temporibus assumenda enim nam neque.","duration":156986,"rate":"$92.00","rate_raw":"92.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Prof. Noah Jaskolski II","number":"0002","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$52.00","task_rate_raw":"52.000000","due_date":"25\/Nov\/2023","private_notes":"","public_notes":"Mollitia ut vel quam. Quia et aut minus.","budgeted_hours":660,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":57,"tasks":[],"client":{"name":"cypress","balance":"13866.150000","payment_balance":"0.000000","credit_balance":"1013.630000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428467,"start_date":"19\/Nov\/2023 21:11:27","end_date_raw":1700443047,"end_date":"20\/Nov\/2023 01:11:27","description":"Unde sequi dicta corporis odio.","billable":true,"duration":14580},{"start_date_raw":1700443347,"start_date":"20\/Nov\/2023 01:11:27","end_date_raw":1700489146,"end_date":"20\/Nov\/2023 14:11:46","description":"Qui rem id inventore velit corporis vitae.","billable":false,"duration":45799},{"start_date_raw":1700489446,"start_date":"20\/Nov\/2023 14:11:46","end_date_raw":1700514655,"end_date":"20\/Nov\/2023 21:11:55","description":"Rerum repellat unde et blanditiis sunt animi aliquid accusantium.","billable":false,"duration":25209},{"start_date_raw":1700514955,"start_date":"20\/Nov\/2023 21:11:55","end_date_raw":1700515449,"end_date":"20\/Nov\/2023 21:11:09","description":"Quasi velit sit et explicabo quibusdam nam.","billable":true,"duration":494},{"start_date_raw":1700515749,"start_date":"20\/Nov\/2023 21:11:09","end_date_raw":1700586653,"end_date":"21\/Nov\/2023 17:11:53","description":"Numquam eos aut eum est corrupti dolorem et.","billable":false,"duration":70904}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Ready to do","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"cypress","balance":"13866.150000","payment_balance":"0.000000","credit_balance":"1013.630000"}},{"number":"0007","description":"Omnis totam eum sed dolores quod rerum. Ducimus voluptate iste quia dolorum consequatur sint. Velit vitae sint qui molestias. Dolores ea rerum voluptates iusto qui natus beatae.","duration":47670,"rate":"$88.00","rate_raw":"88.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Prof. Noah Jaskolski II","number":"0002","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$52.00","task_rate_raw":"52.000000","due_date":"25\/Nov\/2023","private_notes":"","public_notes":"Mollitia ut vel quam. Quia et aut minus.","budgeted_hours":660,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":57,"tasks":[],"client":{"name":"cypress","balance":"13866.150000","payment_balance":"0.000000","credit_balance":"1013.630000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428467,"start_date":"19\/Nov\/2023 21:11:27","end_date_raw":1700476137,"end_date":"20\/Nov\/2023 10:11:57","description":"Sint laudantium quia eveniet quod nobis occaecati nihil.","billable":false,"duration":47670}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"cypress","balance":"13866.150000","payment_balance":"0.000000","credit_balance":"1013.630000"}},{"number":"0008","description":"Molestiae dolor explicabo et in commodi eveniet. Expedita voluptatibus nihil ut. Et porro cumque nisi omnis maxime accusantium earum.","duration":638322,"rate":"$130.00","rate_raw":"130.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700504838,"end_date":"20\/Nov\/2023 18:11:18","description":"Delectus consequatur esse quaerat vel.","billable":false,"duration":76370},{"start_date_raw":1700505138,"start_date":"20\/Nov\/2023 18:11:18","end_date_raw":1700579924,"end_date":"21\/Nov\/2023 15:11:44","description":"Eveniet culpa qui quo architecto recusandae ut occaecati aut.","billable":true,"duration":74786},{"start_date_raw":1700580224,"start_date":"21\/Nov\/2023 15:11:44","end_date_raw":1700646586,"end_date":"22\/Nov\/2023 09:11:46","description":"Delectus quia officiis vero quia corporis.","billable":true,"duration":66362},{"start_date_raw":1700646886,"start_date":"22\/Nov\/2023 09:11:46","end_date_raw":1700732597,"end_date":"23\/Nov\/2023 09:11:17","description":"Non ut placeat dolorum et.","billable":true,"duration":85711},{"start_date_raw":1700732897,"start_date":"23\/Nov\/2023 09:11:17","end_date_raw":1700740803,"end_date":"23\/Nov\/2023 12:11:03","description":"Numquam natus accusantium voluptatem aliquam maxime fugiat voluptatem.","billable":true,"duration":7906},{"start_date_raw":1700741103,"start_date":"23\/Nov\/2023 12:11:03","end_date_raw":1700807283,"end_date":"24\/Nov\/2023 06:11:03","description":"Quae est ut optio atque fugit non.","billable":false,"duration":66180},{"start_date_raw":1700807583,"start_date":"24\/Nov\/2023 06:11:03","end_date_raw":1700889007,"end_date":"25\/Nov\/2023 05:11:07","description":"Natus voluptas quo id nam iure neque eveniet id.","billable":false,"duration":81424},{"start_date_raw":1700889307,"start_date":"25\/Nov\/2023 05:11:07","end_date_raw":1700949728,"end_date":"25\/Nov\/2023 22:11:08","description":"Sed suscipit voluptatem officia reprehenderit qui occaecati saepe veniam.","billable":false,"duration":60421},{"start_date_raw":1700950028,"start_date":"25\/Nov\/2023 22:11:08","end_date_raw":1700972964,"end_date":"26\/Nov\/2023 04:11:24","description":"Officiis sequi aut natus sapiente.","billable":true,"duration":22936},{"start_date_raw":1700973264,"start_date":"26\/Nov\/2023 04:11:24","end_date_raw":1700986155,"end_date":"26\/Nov\/2023 08:11:15","description":"Et similique odit quasi eaque harum.","billable":false,"duration":12891},{"start_date_raw":1700986455,"start_date":"26\/Nov\/2023 08:11:15","end_date_raw":1701069790,"end_date":"27\/Nov\/2023 07:11:10","description":"Qui magnam vero unde nam dolorem qui.","billable":true,"duration":83335}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Ready to do","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Medhurst Inc","balance":"37633.780000","payment_balance":"0.000000","credit_balance":"1025.100000"}},{"number":"0009","description":"Ipsam numquam nesciunt corporis veritatis vitae porro maiores. Delectus sit itaque dolores. Atque et dolorem nisi est.","duration":439161,"rate":"$120.00","rate_raw":"120.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Mr. Easton Streich","number":"0003","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$153.00","task_rate_raw":"153.000000","due_date":"28\/Nov\/2023","private_notes":"","public_notes":"Debitis sit ut voluptatem eaque veritatis.","budgeted_hours":216,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":496,"tasks":[],"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700434593,"end_date":"19\/Nov\/2023 22:11:33","description":"At unde dolores quasi quia.","billable":true,"duration":6125},{"start_date_raw":1700434893,"start_date":"19\/Nov\/2023 23:11:33","end_date_raw":1700498703,"end_date":"20\/Nov\/2023 16:11:03","description":"Et quae non voluptatum nam quia velit suscipit.","billable":false,"duration":63810},{"start_date_raw":1700499003,"start_date":"20\/Nov\/2023 16:11:03","end_date_raw":1700548104,"end_date":"21\/Nov\/2023 06:11:24","description":"Quidem delectus sed et.","billable":true,"duration":49101},{"start_date_raw":1700548404,"start_date":"21\/Nov\/2023 06:11:24","end_date_raw":1700629022,"end_date":"22\/Nov\/2023 04:11:02","description":"Soluta velit enim explicabo dolorem commodi.","billable":false,"duration":80618},{"start_date_raw":1700629322,"start_date":"22\/Nov\/2023 05:11:02","end_date_raw":1700647716,"end_date":"22\/Nov\/2023 10:11:36","description":"Est magni qui quis.","billable":false,"duration":18394},{"start_date_raw":1700648016,"start_date":"22\/Nov\/2023 10:11:36","end_date_raw":1700731147,"end_date":"23\/Nov\/2023 09:11:07","description":"Saepe aspernatur non molestias dolor ea quos in.","billable":false,"duration":83131},{"start_date_raw":1700731447,"start_date":"23\/Nov\/2023 09:11:07","end_date_raw":1700782753,"end_date":"23\/Nov\/2023 23:11:13","description":"Alias id nihil laboriosam aliquam odio qui excepturi.","billable":true,"duration":51306},{"start_date_raw":1700783053,"start_date":"23\/Nov\/2023 23:11:13","end_date_raw":1700795456,"end_date":"24\/Nov\/2023 03:11:56","description":"Eos numquam et atque quia a qui nesciunt.","billable":false,"duration":12403},{"start_date_raw":1700795756,"start_date":"24\/Nov\/2023 03:11:56","end_date_raw":1700812488,"end_date":"24\/Nov\/2023 07:11:48","description":"Ut voluptas in natus qui.","billable":false,"duration":16732},{"start_date_raw":1700812788,"start_date":"24\/Nov\/2023 07:11:48","end_date_raw":1700842826,"end_date":"24\/Nov\/2023 16:11:26","description":"Est aut magnam ratione.","billable":false,"duration":30038},{"start_date_raw":1700843126,"start_date":"24\/Nov\/2023 16:11:26","end_date_raw":1700870629,"end_date":"25\/Nov\/2023 00:11:49","description":"Exercitationem non odio quasi ut saepe.","billable":true,"duration":27503}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}},{"number":"0010","description":"Quo recusandae optio est saepe consectetur optio. Accusantium eum quia eaque. Voluptatum eligendi similique velit dolor eos rerum cumque quaerat.","duration":425934,"rate":"$98.00","rate_raw":"98.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Mr. Easton Streich","number":"0003","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$153.00","task_rate_raw":"153.000000","due_date":"28\/Nov\/2023","private_notes":"","public_notes":"Debitis sit ut voluptatem eaque veritatis.","budgeted_hours":216,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":496,"tasks":[],"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700463790,"end_date":"20\/Nov\/2023 07:11:10","description":"Culpa aut consequatur earum ut.","billable":false,"duration":35322},{"start_date_raw":1700464090,"start_date":"20\/Nov\/2023 07:11:10","end_date_raw":1700536862,"end_date":"21\/Nov\/2023 03:11:02","description":"Reprehenderit et esse qui hic quia est iusto.","billable":false,"duration":72772},{"start_date_raw":1700537162,"start_date":"21\/Nov\/2023 03:11:02","end_date_raw":1700592394,"end_date":"21\/Nov\/2023 18:11:34","description":"In est enim dolore nesciunt distinctio magni qui.","billable":true,"duration":55232},{"start_date_raw":1700592694,"start_date":"21\/Nov\/2023 18:11:34","end_date_raw":1700635771,"end_date":"22\/Nov\/2023 06:11:31","description":"Est saepe quasi alias aut odit officiis corporis.","billable":true,"duration":43077},{"start_date_raw":1700636071,"start_date":"22\/Nov\/2023 06:11:31","end_date_raw":1700637953,"end_date":"22\/Nov\/2023 07:11:53","description":"Consequuntur ipsa ut voluptate accusamus quibusdam sint sed.","billable":false,"duration":1882},{"start_date_raw":1700638253,"start_date":"22\/Nov\/2023 07:11:53","end_date_raw":1700687668,"end_date":"22\/Nov\/2023 21:11:28","description":"Sunt similique error et nostrum reprehenderit dolor.","billable":false,"duration":49415},{"start_date_raw":1700687968,"start_date":"22\/Nov\/2023 21:11:28","end_date_raw":1700712068,"end_date":"23\/Nov\/2023 04:11:08","description":"Aut rerum quis fugiat nostrum facilis ut.","billable":false,"duration":24100},{"start_date_raw":1700712368,"start_date":"23\/Nov\/2023 04:11:08","end_date_raw":1700783951,"end_date":"23\/Nov\/2023 23:11:11","description":"Aut culpa omnis sint et quos quisquam sint.","billable":true,"duration":71583},{"start_date_raw":1700784251,"start_date":"24\/Nov\/2023 00:11:11","end_date_raw":1700845166,"end_date":"24\/Nov\/2023 16:11:26","description":"Voluptas ut ratione porro eaque iste voluptas.","billable":true,"duration":60915},{"start_date_raw":1700845466,"start_date":"24\/Nov\/2023 17:11:26","end_date_raw":1700857102,"end_date":"24\/Nov\/2023 20:11:22","description":"Qui ipsa minus sed saepe maiores necessitatibus.","billable":true,"duration":11636}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Done","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}},{"number":"0011","description":"Eligendi molestiae et quis et tempora esse ut. Sed ut est possimus et minus aut incidunt. Quibusdam rerum incidunt molestias est qui quam temporibus fuga.","duration":637522,"rate":"$120.00","rate_raw":"120.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Mr. Easton Streich","number":"0003","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$153.00","task_rate_raw":"153.000000","due_date":"28\/Nov\/2023","private_notes":"","public_notes":"Debitis sit ut voluptatem eaque veritatis.","budgeted_hours":216,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":496,"tasks":[],"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700499282,"end_date":"20\/Nov\/2023 16:11:42","description":"Quasi temporibus doloremque consequatur minus pariatur facere.","billable":true,"duration":70814},{"start_date_raw":1700499582,"start_date":"20\/Nov\/2023 16:11:42","end_date_raw":1700584386,"end_date":"21\/Nov\/2023 16:11:06","description":"Id distinctio sed eos qui.","billable":true,"duration":84804},{"start_date_raw":1700584686,"start_date":"21\/Nov\/2023 16:11:06","end_date_raw":1700635554,"end_date":"22\/Nov\/2023 06:11:54","description":"Facere explicabo non nostrum.","billable":true,"duration":50868},{"start_date_raw":1700635854,"start_date":"22\/Nov\/2023 06:11:54","end_date_raw":1700672533,"end_date":"22\/Nov\/2023 17:11:13","description":"Numquam sit labore facere voluptatibus quibusdam reiciendis et.","billable":true,"duration":36679},{"start_date_raw":1700672833,"start_date":"22\/Nov\/2023 17:11:13","end_date_raw":1700678587,"end_date":"22\/Nov\/2023 18:11:07","description":"Perspiciatis ad hic nostrum et.","billable":true,"duration":5754},{"start_date_raw":1700678887,"start_date":"22\/Nov\/2023 18:11:07","end_date_raw":1700708730,"end_date":"23\/Nov\/2023 03:11:30","description":"Qui culpa iure eos quaerat voluptatum numquam inventore.","billable":true,"duration":29843},{"start_date_raw":1700709030,"start_date":"23\/Nov\/2023 03:11:30","end_date_raw":1700765439,"end_date":"23\/Nov\/2023 18:11:39","description":"Similique molestiae atque voluptatem debitis dolorem quos quis et.","billable":false,"duration":56409},{"start_date_raw":1700765739,"start_date":"23\/Nov\/2023 18:11:39","end_date_raw":1700831780,"end_date":"24\/Nov\/2023 13:11:20","description":"Nam dolorum optio et omnis.","billable":true,"duration":66041},{"start_date_raw":1700832080,"start_date":"24\/Nov\/2023 13:11:20","end_date_raw":1700844498,"end_date":"24\/Nov\/2023 16:11:18","description":"Non eos amet repellat tempore id.","billable":false,"duration":12418},{"start_date_raw":1700844798,"start_date":"24\/Nov\/2023 16:11:18","end_date_raw":1700899153,"end_date":"25\/Nov\/2023 07:11:13","description":"Iste neque nostrum laudantium officia.","billable":false,"duration":54355},{"start_date_raw":1700899453,"start_date":"25\/Nov\/2023 08:11:13","end_date_raw":1700971949,"end_date":"26\/Nov\/2023 04:11:29","description":"Ut quia ratione sed et.","billable":true,"duration":72496},{"start_date_raw":1700972249,"start_date":"26\/Nov\/2023 04:11:29","end_date_raw":1700984833,"end_date":"26\/Nov\/2023 07:11:13","description":"Sapiente quia magni quisquam eos rerum rem.","billable":false,"duration":12584},{"start_date_raw":1700985133,"start_date":"26\/Nov\/2023 07:11:13","end_date_raw":1701069590,"end_date":"27\/Nov\/2023 07:11:50","description":"Nulla et ducimus doloribus est.","billable":true,"duration":84457}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Done","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}},{"number":"0012","description":"Ea cumque amet quas et suscipit. Voluptatum libero enim minus necessitatibus qui voluptatem. Voluptates soluta quae in et aut possimus veniam.","duration":283580,"rate":"$78.00","rate_raw":"78.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Mr. Easton Streich","number":"0003","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$153.00","task_rate_raw":"153.000000","due_date":"28\/Nov\/2023","private_notes":"","public_notes":"Debitis sit ut voluptatem eaque veritatis.","budgeted_hours":216,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":496,"tasks":[],"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700469690,"end_date":"20\/Nov\/2023 08:11:30","description":"Placeat vel sit voluptas architecto sed.","billable":true,"duration":41222},{"start_date_raw":1700469990,"start_date":"20\/Nov\/2023 08:11:30","end_date_raw":1700483859,"end_date":"20\/Nov\/2023 12:11:39","description":"Voluptatem est quo est dolorem.","billable":true,"duration":13869},{"start_date_raw":1700484159,"start_date":"20\/Nov\/2023 12:11:39","end_date_raw":1700541376,"end_date":"21\/Nov\/2023 04:11:16","description":"Perferendis nulla quos omnis inventore sint.","billable":false,"duration":57217},{"start_date_raw":1700541676,"start_date":"21\/Nov\/2023 04:11:16","end_date_raw":1700609280,"end_date":"21\/Nov\/2023 23:11:00","description":"Quia quae ad cum neque.","billable":true,"duration":67604},{"start_date_raw":1700609580,"start_date":"21\/Nov\/2023 23:11:00","end_date_raw":1700668490,"end_date":"22\/Nov\/2023 15:11:50","description":"Pariatur et ipsa cumque consequatur voluptatum nemo.","billable":true,"duration":58910},{"start_date_raw":1700668790,"start_date":"22\/Nov\/2023 15:11:50","end_date_raw":1700690815,"end_date":"22\/Nov\/2023 22:11:55","description":"Officia explicabo illo ex tenetur.","billable":true,"duration":22025},{"start_date_raw":1700691115,"start_date":"22\/Nov\/2023 22:11:55","end_date_raw":1700713848,"end_date":"23\/Nov\/2023 04:11:48","description":"Quasi neque tempore aut at.","billable":true,"duration":22733}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Ready to do","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}},{"number":"0013","description":"Enim eveniet rem illo sed voluptatem vero dolorem. Sed consequatur quia autem culpa. Sed perspiciatis ullam non.","duration":512814,"rate":"$145.00","rate_raw":"145.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700442008,"end_date":"20\/Nov\/2023 01:11:08","description":"Et et delectus in rerum fuga et ipsam.","billable":true,"duration":13540},{"start_date_raw":1700442308,"start_date":"20\/Nov\/2023 01:11:08","end_date_raw":1700488304,"end_date":"20\/Nov\/2023 13:11:44","description":"In porro et sed eos.","billable":true,"duration":45996},{"start_date_raw":1700488604,"start_date":"20\/Nov\/2023 13:11:44","end_date_raw":1700529328,"end_date":"21\/Nov\/2023 01:11:28","description":"Eveniet similique sint minima voluptatibus voluptatem sunt.","billable":false,"duration":40724},{"start_date_raw":1700529628,"start_date":"21\/Nov\/2023 01:11:28","end_date_raw":1700560989,"end_date":"21\/Nov\/2023 10:11:09","description":"Ut est fuga id qui ut.","billable":false,"duration":31361},{"start_date_raw":1700561289,"start_date":"21\/Nov\/2023 10:11:09","end_date_raw":1700635644,"end_date":"22\/Nov\/2023 06:11:24","description":"Est consequatur nisi itaque.","billable":false,"duration":74355},{"start_date_raw":1700635944,"start_date":"22\/Nov\/2023 06:11:24","end_date_raw":1700650878,"end_date":"22\/Nov\/2023 11:11:18","description":"Ut vitae et velit magnam aut sed ut.","billable":true,"duration":14934},{"start_date_raw":1700651178,"start_date":"22\/Nov\/2023 11:11:18","end_date_raw":1700672376,"end_date":"22\/Nov\/2023 16:11:36","description":"Id odio laudantium quae similique.","billable":false,"duration":21198},{"start_date_raw":1700672676,"start_date":"22\/Nov\/2023 17:11:36","end_date_raw":1700734868,"end_date":"23\/Nov\/2023 10:11:08","description":"Saepe non vel reiciendis autem quidem quos.","billable":true,"duration":62192},{"start_date_raw":1700735168,"start_date":"23\/Nov\/2023 10:11:08","end_date_raw":1700772446,"end_date":"23\/Nov\/2023 20:11:26","description":"Occaecati commodi cupiditate esse molestiae velit.","billable":true,"duration":37278},{"start_date_raw":1700772746,"start_date":"23\/Nov\/2023 20:11:26","end_date_raw":1700785864,"end_date":"24\/Nov\/2023 00:11:04","description":"Quia et cupiditate expedita cumque quas.","billable":true,"duration":13118},{"start_date_raw":1700786164,"start_date":"24\/Nov\/2023 00:11:04","end_date_raw":1700806681,"end_date":"24\/Nov\/2023 06:11:01","description":"Eos consequatur soluta labore soluta ut.","billable":true,"duration":20517},{"start_date_raw":1700806981,"start_date":"24\/Nov\/2023 06:11:01","end_date_raw":1700839054,"end_date":"24\/Nov\/2023 15:11:34","description":"Impedit vel pariatur dicta necessitatibus at harum eius.","billable":true,"duration":32073},{"start_date_raw":1700839354,"start_date":"24\/Nov\/2023 15:11:34","end_date_raw":1700866888,"end_date":"24\/Nov\/2023 23:11:28","description":"Laboriosam nihil veritatis voluptatum qui laboriosam iusto.","billable":true,"duration":27534},{"start_date_raw":1700867188,"start_date":"24\/Nov\/2023 23:11:28","end_date_raw":1700875021,"end_date":"25\/Nov\/2023 01:11:01","description":"Error accusamus sapiente reiciendis.","billable":true,"duration":7833},{"start_date_raw":1700875321,"start_date":"25\/Nov\/2023 01:11:01","end_date_raw":1700886769,"end_date":"25\/Nov\/2023 04:11:49","description":"Impedit eius consequatur quod qui quod expedita quis.","billable":false,"duration":11448},{"start_date_raw":1700887069,"start_date":"25\/Nov\/2023 04:11:49","end_date_raw":1700945782,"end_date":"25\/Nov\/2023 20:11:22","description":"Tempora omnis nesciunt placeat omnis architecto quis.","billable":true,"duration":58713}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Done","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000"}},{"number":"0014","description":"In soluta aliquid et eius. Molestiae veritatis animi culpa et amet porro modi ut. Id sequi nobis itaque modi explicabo voluptatem quam. Non ex voluptatem error aspernatur odit.","duration":346244,"rate":"$70.00","rate_raw":"70.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Elenor Orn","number":"0004","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$39.00","task_rate_raw":"39.000000","due_date":"27\/Nov\/2023","private_notes":"","public_notes":"Distinctio ut voluptas deleniti est sed quae.","budgeted_hours":372,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":331,"tasks":[],"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700458211,"end_date":"20\/Nov\/2023 05:11:11","description":"Voluptate aut dicta recusandae consectetur est ducimus.","billable":false,"duration":29743},{"start_date_raw":1700458511,"start_date":"20\/Nov\/2023 05:11:11","end_date_raw":1700516247,"end_date":"20\/Nov\/2023 21:11:27","description":"Dolores incidunt praesentium rerum.","billable":false,"duration":57736},{"start_date_raw":1700516547,"start_date":"20\/Nov\/2023 21:11:27","end_date_raw":1700549251,"end_date":"21\/Nov\/2023 06:11:31","description":"Perspiciatis consequatur et alias praesentium placeat modi aut.","billable":true,"duration":32704},{"start_date_raw":1700549551,"start_date":"21\/Nov\/2023 06:11:31","end_date_raw":1700618445,"end_date":"22\/Nov\/2023 02:11:45","description":"Esse libero incidunt non rem sunt quisquam repudiandae nisi.","billable":true,"duration":68894},{"start_date_raw":1700618745,"start_date":"22\/Nov\/2023 02:11:45","end_date_raw":1700698086,"end_date":"23\/Nov\/2023 00:11:06","description":"Earum consectetur esse fugit sint autem tempore.","billable":true,"duration":79341},{"start_date_raw":1700698386,"start_date":"23\/Nov\/2023 00:11:06","end_date_raw":1700776212,"end_date":"23\/Nov\/2023 21:11:12","description":"Saepe sit consequatur vel eos ad iusto nobis.","billable":true,"duration":77826}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Ready to do","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}},{"number":"0015","description":"Minus accusamus illum quia nihil voluptatum qui mollitia vel. Natus fugiat sequi quod eius occaecati non. Minus rerum ut eos est eveniet quae iure.","duration":410859,"rate":"$13.00","rate_raw":"13.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Elenor Orn","number":"0004","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$39.00","task_rate_raw":"39.000000","due_date":"27\/Nov\/2023","private_notes":"","public_notes":"Distinctio ut voluptas deleniti est sed quae.","budgeted_hours":372,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":331,"tasks":[],"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700506053,"end_date":"20\/Nov\/2023 18:11:33","description":"Iste neque officiis eum maiores.","billable":true,"duration":77585},{"start_date_raw":1700506353,"start_date":"20\/Nov\/2023 18:11:33","end_date_raw":1700572042,"end_date":"21\/Nov\/2023 13:11:22","description":"Minus perferendis quia amet.","billable":true,"duration":65689},{"start_date_raw":1700572342,"start_date":"21\/Nov\/2023 13:11:22","end_date_raw":1700637291,"end_date":"22\/Nov\/2023 07:11:51","description":"Commodi quaerat hic minus et voluptas velit.","billable":true,"duration":64949},{"start_date_raw":1700637591,"start_date":"22\/Nov\/2023 07:11:51","end_date_raw":1700649610,"end_date":"22\/Nov\/2023 10:11:10","description":"Vitae rerum natus aperiam quia explicabo.","billable":false,"duration":12019},{"start_date_raw":1700649910,"start_date":"22\/Nov\/2023 10:11:10","end_date_raw":1700693674,"end_date":"22\/Nov\/2023 22:11:34","description":"Quos sunt dolorum eveniet provident ut.","billable":false,"duration":43764},{"start_date_raw":1700693974,"start_date":"22\/Nov\/2023 22:11:34","end_date_raw":1700775335,"end_date":"23\/Nov\/2023 21:11:35","description":"Animi quibusdam quisquam ea error earum consectetur.","billable":true,"duration":81361},{"start_date_raw":1700775635,"start_date":"23\/Nov\/2023 21:11:35","end_date_raw":1700808126,"end_date":"24\/Nov\/2023 06:11:06","description":"Ratione ipsam molestiae dolorem sit architecto voluptas.","billable":true,"duration":32491},{"start_date_raw":1700808426,"start_date":"24\/Nov\/2023 06:11:06","end_date_raw":1700817758,"end_date":"24\/Nov\/2023 09:11:38","description":"Maxime reprehenderit voluptates culpa.","billable":false,"duration":9332},{"start_date_raw":1700818058,"start_date":"24\/Nov\/2023 09:11:38","end_date_raw":1700841727,"end_date":"24\/Nov\/2023 16:11:07","description":"Atque deleniti et laboriosam molestias repellat accusamus omnis.","billable":false,"duration":23669}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}},{"number":"0016","description":"Temporibus illum voluptatibus molestias quia omnis illo molestias corporis. Hic et hic quia dolores quas sint dolorem. Repellendus minus quae fuga illum amet in voluptatum. Rerum mollitia est eum voluptatum architecto non nisi qui. Est et dolores omnis placeat repellat sed facilis.","duration":435319,"rate":"$89.00","rate_raw":"89.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Elenor Orn","number":"0004","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$39.00","task_rate_raw":"39.000000","due_date":"27\/Nov\/2023","private_notes":"","public_notes":"Distinctio ut voluptas deleniti est sed quae.","budgeted_hours":372,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":331,"tasks":[],"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428469,"start_date":"19\/Nov\/2023 21:11:29","end_date_raw":1700496403,"end_date":"20\/Nov\/2023 16:11:43","description":"Sunt unde repellat reiciendis quos porro et dolores.","billable":true,"duration":67934},{"start_date_raw":1700496703,"start_date":"20\/Nov\/2023 16:11:43","end_date_raw":1700551129,"end_date":"21\/Nov\/2023 07:11:49","description":"Voluptatem laborum repudiandae enim asperiores.","billable":false,"duration":54426},{"start_date_raw":1700551429,"start_date":"21\/Nov\/2023 07:11:49","end_date_raw":1700631865,"end_date":"22\/Nov\/2023 05:11:25","description":"Placeat numquam magnam occaecati.","billable":false,"duration":80436},{"start_date_raw":1700632165,"start_date":"22\/Nov\/2023 05:11:25","end_date_raw":1700695854,"end_date":"22\/Nov\/2023 23:11:54","description":"Qui quo et est vero autem reprehenderit.","billable":false,"duration":63689},{"start_date_raw":1700696154,"start_date":"22\/Nov\/2023 23:11:54","end_date_raw":1700736857,"end_date":"23\/Nov\/2023 10:11:17","description":"Et voluptatem distinctio dolor fuga hic ea.","billable":false,"duration":40703},{"start_date_raw":1700737157,"start_date":"23\/Nov\/2023 10:11:17","end_date_raw":1700790692,"end_date":"24\/Nov\/2023 01:11:32","description":"Quo expedita quidem ab dolor quam expedita porro.","billable":true,"duration":53535},{"start_date_raw":1700790992,"start_date":"24\/Nov\/2023 01:11:32","end_date_raw":1700817527,"end_date":"24\/Nov\/2023 09:11:47","description":"Adipisci voluptatem officiis quaerat ut quos facilis.","billable":false,"duration":26535},{"start_date_raw":1700817827,"start_date":"24\/Nov\/2023 09:11:47","end_date_raw":1700865888,"end_date":"24\/Nov\/2023 22:11:48","description":"Tenetur ut dolorem vero.","billable":true,"duration":48061}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Done","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}},{"number":"0017","description":"Repudiandae nam labore dolores nihil sunt dolorem recusandae rerum. Ut consequatur vel et aut facilis. Sapiente distinctio cupiditate qui repellat ipsum harum.","duration":835159,"rate":"$65.00","rate_raw":"65.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428469,"start_date":"19\/Nov\/2023 21:11:29","end_date_raw":1700448921,"end_date":"20\/Nov\/2023 02:11:21","description":"Veniam iusto aperiam quis sunt nihil qui neque.","billable":true,"duration":20452},{"start_date_raw":1700449221,"start_date":"20\/Nov\/2023 03:11:21","end_date_raw":1700480544,"end_date":"20\/Nov\/2023 11:11:24","description":"Molestiae vero ea quis numquam et dicta reprehenderit.","billable":true,"duration":31323},{"start_date_raw":1700480844,"start_date":"20\/Nov\/2023 11:11:24","end_date_raw":1700513241,"end_date":"20\/Nov\/2023 20:11:21","description":"Qui id accusantium eius esse pariatur qui.","billable":false,"duration":32397},{"start_date_raw":1700513541,"start_date":"20\/Nov\/2023 20:11:21","end_date_raw":1700579256,"end_date":"21\/Nov\/2023 15:11:36","description":"Unde porro perspiciatis dolor praesentium dolor.","billable":true,"duration":65715},{"start_date_raw":1700579556,"start_date":"21\/Nov\/2023 15:11:36","end_date_raw":1700631702,"end_date":"22\/Nov\/2023 05:11:42","description":"Laboriosam eligendi deserunt veritatis impedit ipsum rerum voluptas.","billable":false,"duration":52146},{"start_date_raw":1700632002,"start_date":"22\/Nov\/2023 05:11:42","end_date_raw":1700687284,"end_date":"22\/Nov\/2023 21:11:04","description":"Molestiae sint a facere.","billable":true,"duration":55282},{"start_date_raw":1700687584,"start_date":"22\/Nov\/2023 21:11:04","end_date_raw":1700731618,"end_date":"23\/Nov\/2023 09:11:58","description":"Asperiores in repudiandae eligendi sed eveniet sequi quae.","billable":false,"duration":44034},{"start_date_raw":1700731918,"start_date":"23\/Nov\/2023 09:11:58","end_date_raw":1700785496,"end_date":"24\/Nov\/2023 00:11:56","description":"Ratione quia rem odit ea doloremque et.","billable":true,"duration":53578},{"start_date_raw":1700785796,"start_date":"24\/Nov\/2023 00:11:56","end_date_raw":1700814699,"end_date":"24\/Nov\/2023 08:11:39","description":"Deserunt quam alias incidunt sit placeat tenetur.","billable":true,"duration":28903},{"start_date_raw":1700814999,"start_date":"24\/Nov\/2023 08:11:39","end_date_raw":1700889011,"end_date":"25\/Nov\/2023 05:11:11","description":"Libero sed numquam quidem vel esse magni vel laudantium.","billable":false,"duration":74012},{"start_date_raw":1700889311,"start_date":"25\/Nov\/2023 05:11:11","end_date_raw":1700943511,"end_date":"25\/Nov\/2023 20:11:31","description":"Rerum aliquid aliquam error deleniti quo eaque.","billable":true,"duration":54200},{"start_date_raw":1700943811,"start_date":"25\/Nov\/2023 20:11:31","end_date_raw":1701013647,"end_date":"26\/Nov\/2023 15:11:27","description":"Quos vel est rerum nihil id.","billable":false,"duration":69836},{"start_date_raw":1701013947,"start_date":"26\/Nov\/2023 15:11:27","end_date_raw":1701099520,"end_date":"27\/Nov\/2023 15:11:40","description":"Cum quia maxime dignissimos quo.","billable":true,"duration":85573},{"start_date_raw":1701099820,"start_date":"27\/Nov\/2023 15:11:40","end_date_raw":1701163104,"end_date":"28\/Nov\/2023 09:11:24","description":"Amet ea exercitationem quo sed eos corporis.","billable":false,"duration":63284},{"start_date_raw":1701163404,"start_date":"28\/Nov\/2023 09:11:24","end_date_raw":1701220140,"end_date":"29\/Nov\/2023 01:11:00","description":"Sunt voluptas atque odio nesciunt aliquam in earum.","billable":true,"duration":56736},{"start_date_raw":1701220440,"start_date":"29\/Nov\/2023 01:11:00","end_date_raw":1701268128,"end_date":"29\/Nov\/2023 14:11:48","description":"Odio voluptatibus rerum non.","billable":false,"duration":47688}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000"}},{"number":"0018","description":"Odit rerum iusto quibusdam. A mollitia cupiditate enim consequatur omnis qui voluptas quibusdam. Recusandae et non ut ipsum asperiores non iusto.","duration":312865,"rate":"$95.00","rate_raw":"95.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Maryjane Macejkovic","number":"0005","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$78.00","task_rate_raw":"78.000000","due_date":"26\/Nov\/2023","private_notes":"","public_notes":"Nesciunt est sit ea explicabo.","budgeted_hours":405,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":194,"tasks":[],"client":{"name":"Medhurst Inc","balance":"37633.780000","payment_balance":"0.000000","credit_balance":"1025.100000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428469,"start_date":"19\/Nov\/2023 21:11:29","end_date_raw":1700476677,"end_date":"20\/Nov\/2023 10:11:57","description":"Quam dolores ut dolorem quo sint atque.","billable":true,"duration":48208},{"start_date_raw":1700476977,"start_date":"20\/Nov\/2023 10:11:57","end_date_raw":1700520944,"end_date":"20\/Nov\/2023 22:11:44","description":"Unde minus veniam corporis qui laboriosam suscipit quas.","billable":true,"duration":43967},{"start_date_raw":1700521244,"start_date":"20\/Nov\/2023 23:11:44","end_date_raw":1700602639,"end_date":"21\/Nov\/2023 21:11:19","description":"Beatae molestiae molestias sed dolor recusandae et id eligendi.","billable":false,"duration":81395},{"start_date_raw":1700602939,"start_date":"21\/Nov\/2023 21:11:19","end_date_raw":1700682077,"end_date":"22\/Nov\/2023 19:11:17","description":"Repellendus nam perspiciatis exercitationem in iste officia.","billable":true,"duration":79138},{"start_date_raw":1700682377,"start_date":"22\/Nov\/2023 19:11:17","end_date_raw":1700692054,"end_date":"22\/Nov\/2023 22:11:34","description":"Consequatur quaerat dolor consequuntur aperiam enim reiciendis.","billable":true,"duration":9677},{"start_date_raw":1700692354,"start_date":"22\/Nov\/2023 22:11:34","end_date_raw":1700742834,"end_date":"23\/Nov\/2023 12:11:54","description":"Qui quia ut sed accusantium odit reprehenderit quaerat.","billable":true,"duration":50480}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Medhurst Inc","balance":"37633.780000","payment_balance":"0.000000","credit_balance":"1025.100000"}},{"number":"0019","description":"Eius et dolor libero repellendus iste. Nemo sit error sed necessitatibus architecto et. Aspernatur omnis doloremque animi quas sed.","duration":387217,"rate":"$87.00","rate_raw":"87.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Maryjane Macejkovic","number":"0005","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$78.00","task_rate_raw":"78.000000","due_date":"26\/Nov\/2023","private_notes":"","public_notes":"Nesciunt est sit ea explicabo.","budgeted_hours":405,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":194,"tasks":[],"client":{"name":"Medhurst Inc","balance":"37633.780000","payment_balance":"0.000000","credit_balance":"1025.100000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428469,"start_date":"19\/Nov\/2023 21:11:29","end_date_raw":1700434042,"end_date":"19\/Nov\/2023 22:11:22","description":"Aut aliquam totam in reprehenderit sint suscipit earum.","billable":false,"duration":5573},{"start_date_raw":1700434342,"start_date":"19\/Nov\/2023 22:11:22","end_date_raw":1700467844,"end_date":"20\/Nov\/2023 08:11:44","description":"Hic aliquid natus est.","billable":false,"duration":33502},{"start_date_raw":1700468144,"start_date":"20\/Nov\/2023 08:11:44","end_date_raw":1700532877,"end_date":"21\/Nov\/2023 02:11:37","description":"Illo atque dolores eligendi minus et ut consequuntur.","billable":false,"duration":64733},{"start_date_raw":1700533177,"start_date":"21\/Nov\/2023 02:11:37","end_date_raw":1700619369,"end_date":"22\/Nov\/2023 02:11:09","description":"Libero ipsa eligendi sit dolor eligendi quibusdam dicta tenetur.","billable":false,"duration":86192},{"start_date_raw":1700619669,"start_date":"22\/Nov\/2023 02:11:09","end_date_raw":1700646879,"end_date":"22\/Nov\/2023 09:11:39","description":"Dolor unde assumenda blanditiis tenetur blanditiis ipsam quis.","billable":true,"duration":27210},{"start_date_raw":1700647179,"start_date":"22\/Nov\/2023 09:11:39","end_date_raw":1700704537,"end_date":"23\/Nov\/2023 01:11:37","description":"Reprehenderit possimus nisi recusandae.","billable":true,"duration":57358},{"start_date_raw":1700704837,"start_date":"23\/Nov\/2023 02:11:37","end_date_raw":1700733175,"end_date":"23\/Nov\/2023 09:11:55","description":"Aut saepe sint qui magni.","billable":false,"duration":28338},{"start_date_raw":1700733475,"start_date":"23\/Nov\/2023 09:11:55","end_date_raw":1700735626,"end_date":"23\/Nov\/2023 10:11:46","description":"Facere repellendus voluptas illo a.","billable":true,"duration":2151},{"start_date_raw":1700735926,"start_date":"23\/Nov\/2023 10:11:46","end_date_raw":1700769798,"end_date":"23\/Nov\/2023 20:11:18","description":"Voluptatem praesentium ipsum soluta earum.","billable":false,"duration":33872},{"start_date_raw":1700770098,"start_date":"23\/Nov\/2023 20:11:18","end_date_raw":1700818386,"end_date":"24\/Nov\/2023 09:11:06","description":"Dicta eum quis dicta quae.","billable":true,"duration":48288}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Medhurst Inc","balance":"37633.780000","payment_balance":"0.000000","credit_balance":"1025.100000"}}]'; + public string $task_data = '[{"number":"0001","description":"Reiciendis itaque molestias blanditiis cupiditate ea. Minus officiis natus itaque. Consectetur et aut veritatis quae ut esse ut. Accusantium dolore quaerat sit qui. Magni quia sunt corporis.","duration":149031,"rate":"$71.00","rate_raw":"71.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428466,"start_date":"19\/Nov\/2023 21:11:26","end_date_raw":1700470150,"end_date":"20\/Nov\/2023 08:11:10","description":"Assumenda nihil vitae odio voluptatem iusto ipsam repellendus.","billable":false,"duration":41684},{"start_date_raw":1700470450,"start_date":"20\/Nov\/2023 08:11:10","end_date_raw":1700485036,"end_date":"20\/Nov\/2023 12:11:16","description":"Adipisci amet optio tempore et.","billable":true,"duration":14586},{"start_date_raw":1700485336,"start_date":"20\/Nov\/2023 13:11:16","end_date_raw":1700572291,"end_date":"21\/Nov\/2023 13:11:31","description":"Ratione repellat saepe mollitia perspiciatis optio.","billable":false,"duration":86955},{"start_date_raw":1700572591,"start_date":"21\/Nov\/2023 13:11:31","end_date_raw":1700578397,"end_date":"21\/Nov\/2023 14:11:17","description":"Molestias perferendis ipsa odit id aut sunt.","billable":true,"duration":5806}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Done","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Medhurst Inc","balance":"37633.780000","payment_balance":"0.000000","credit_balance":"1025.100000","vat_number":"VAT123"}},{"number":"0002","description":"Et dolorem nihil qui quas asperiores nulla aut praesentium. Ea quasi porro facere eligendi. Et assumenda illum nostrum natus repellat eveniet. Sequi odio nulla perspiciatis doloremque.","duration":966982,"rate":"$76.00","rate_raw":"76.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Abel Moore","number":"0001","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$107.00","task_rate_raw":"107.000000","due_date":"25\/Nov\/2023","private_notes":"","public_notes":"Omnis modi optio maxime ut inventore.","budgeted_hours":339,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":390,"tasks":[],"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000","vat_number":"VAT123"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428466,"start_date":"19\/Nov\/2023 21:11:26","end_date_raw":1700492035,"end_date":"20\/Nov\/2023 14:11:55","description":"Nihil voluptas et sint et.","billable":true,"duration":63569},{"start_date_raw":1700492335,"start_date":"20\/Nov\/2023 14:11:55","end_date_raw":1700554011,"end_date":"21\/Nov\/2023 08:11:51","description":"Aut consequuntur aliquam earum aut reiciendis.","billable":false,"duration":61676},{"start_date_raw":1700554311,"start_date":"21\/Nov\/2023 08:11:51","end_date_raw":1700586651,"end_date":"21\/Nov\/2023 17:11:51","description":"Occaecati consectetur temporibus neque rerum sed rem iure.","billable":true,"duration":32340},{"start_date_raw":1700586951,"start_date":"21\/Nov\/2023 17:11:51","end_date_raw":1700644903,"end_date":"22\/Nov\/2023 09:11:43","description":"Ducimus voluptate aliquid aliquam nobis.","billable":true,"duration":57952},{"start_date_raw":1700645203,"start_date":"22\/Nov\/2023 09:11:43","end_date_raw":1700724132,"end_date":"23\/Nov\/2023 07:11:12","description":"Non ipsam consequatur voluptatem illum.","billable":true,"duration":78929},{"start_date_raw":1700724432,"start_date":"23\/Nov\/2023 07:11:12","end_date_raw":1700790596,"end_date":"24\/Nov\/2023 01:11:56","description":"Aspernatur quia voluptate molestias non.","billable":false,"duration":66164},{"start_date_raw":1700790896,"start_date":"24\/Nov\/2023 01:11:56","end_date_raw":1700812808,"end_date":"24\/Nov\/2023 08:11:08","description":"Sed quod omnis officiis asperiores natus facere minus nemo.","billable":false,"duration":21912},{"start_date_raw":1700813108,"start_date":"24\/Nov\/2023 08:11:08","end_date_raw":1700865275,"end_date":"24\/Nov\/2023 22:11:35","description":"Tenetur quaerat ea magni placeat.","billable":false,"duration":52167},{"start_date_raw":1700865575,"start_date":"24\/Nov\/2023 22:11:35","end_date_raw":1700888516,"end_date":"25\/Nov\/2023 05:11:56","description":"Sequi dolor laborum deserunt rerum.","billable":true,"duration":22941},{"start_date_raw":1700888816,"start_date":"25\/Nov\/2023 05:11:56","end_date_raw":1700933259,"end_date":"25\/Nov\/2023 17:11:39","description":"Est qui velit ipsum et nesciunt qui ut.","billable":true,"duration":44443},{"start_date_raw":1700933559,"start_date":"25\/Nov\/2023 17:11:39","end_date_raw":1700979107,"end_date":"26\/Nov\/2023 06:11:47","description":"Sint et quo quo.","billable":false,"duration":45548},{"start_date_raw":1700979407,"start_date":"26\/Nov\/2023 06:11:47","end_date_raw":1701002669,"end_date":"26\/Nov\/2023 12:11:29","description":"Omnis unde sit similique dolor fugit totam.","billable":true,"duration":23262},{"start_date_raw":1701002969,"start_date":"26\/Nov\/2023 12:11:29","end_date_raw":1701071339,"end_date":"27\/Nov\/2023 07:11:59","description":"Ducimus qui voluptas accusamus.","billable":true,"duration":68370},{"start_date_raw":1701071639,"start_date":"27\/Nov\/2023 07:11:59","end_date_raw":1701100825,"end_date":"27\/Nov\/2023 16:11:25","description":"Soluta sit non nobis ab et ad libero sint.","billable":false,"duration":29186},{"start_date_raw":1701101125,"start_date":"27\/Nov\/2023 16:11:25","end_date_raw":1701157799,"end_date":"28\/Nov\/2023 07:11:59","description":"Cumque dignissimos error qui ut.","billable":true,"duration":56674},{"start_date_raw":1701158099,"start_date":"28\/Nov\/2023 07:11:59","end_date_raw":1701214020,"end_date":"28\/Nov\/2023 23:11:00","description":"Molestias omnis aliquid voluptatem cupiditate ut.","billable":true,"duration":55921},{"start_date_raw":1701214320,"start_date":"28\/Nov\/2023 23:11:00","end_date_raw":1701286375,"end_date":"29\/Nov\/2023 19:11:55","description":"Distinctio commodi est ab.","billable":true,"duration":72055},{"start_date_raw":1701286675,"start_date":"29\/Nov\/2023 19:11:55","end_date_raw":1701330081,"end_date":"30\/Nov\/2023 07:11:21","description":"Nisi dolores omnis veritatis.","billable":false,"duration":43406},{"start_date_raw":1701330381,"start_date":"30\/Nov\/2023 07:11:21","end_date_raw":1701398228,"end_date":"01\/Dec\/2023 02:12:08","description":"Qui aut velit quam dolore qui asperiores.","billable":false,"duration":67847},{"start_date_raw":1701398528,"start_date":"01\/Dec\/2023 02:12:08","end_date_raw":1701401148,"end_date":"01\/Dec\/2023 03:12:48","description":"Laudantium est laudantium ea ut repellendus.","billable":true,"duration":2620}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000","vat_number":"VAT123"}},{"number":"0003","description":"Qui excepturi et aut et voluptates eius perferendis. Repellat eum illo quis aliquid occaecati reprehenderit officia. Est earum nihil similique recusandae aut ut est error. Enim molestiae assumenda quaerat neque unde. Consequatur vel placeat commodi molestiae.","duration":259657,"rate":"$9.00","rate_raw":"9.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Abel Moore","number":"0001","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$107.00","task_rate_raw":"107.000000","due_date":"25\/Nov\/2023","private_notes":"","public_notes":"Omnis modi optio maxime ut inventore.","budgeted_hours":339,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":390,"tasks":[],"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000","vat_number":"VAT123"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428466,"start_date":"19\/Nov\/2023 21:11:26","end_date_raw":1700498928,"end_date":"20\/Nov\/2023 16:11:48","description":"Animi asperiores velit quaerat sapiente dolorem officiis.","billable":false,"duration":70462},{"start_date_raw":1700499228,"start_date":"20\/Nov\/2023 16:11:48","end_date_raw":1700516753,"end_date":"20\/Nov\/2023 21:11:53","description":"Et facere ut tempora similique et sunt culpa.","billable":false,"duration":17525},{"start_date_raw":1700517053,"start_date":"20\/Nov\/2023 21:11:53","end_date_raw":1700523921,"end_date":"20\/Nov\/2023 23:11:21","description":"Consequatur enim non reprehenderit quia.","billable":false,"duration":6868},{"start_date_raw":1700524221,"start_date":"20\/Nov\/2023 23:11:21","end_date_raw":1700609374,"end_date":"21\/Nov\/2023 23:11:34","description":"Nobis non nesciunt ut reprehenderit at.","billable":false,"duration":85153},{"start_date_raw":1700609674,"start_date":"21\/Nov\/2023 23:11:34","end_date_raw":1700689323,"end_date":"22\/Nov\/2023 21:11:03","description":"Blanditiis repellendus quo voluptatum eveniet iste.","billable":false,"duration":79649}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Ready to do","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000","vat_number":"VAT123"}},{"number":"0004","description":"Ipsam tempora id vero perferendis. Nulla laudantium iste qui quod et voluptatem. Aliquam et vel est minus ratione.","duration":179131,"rate":"$146.00","rate_raw":"146.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Abel Moore","number":"0001","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$107.00","task_rate_raw":"107.000000","due_date":"25\/Nov\/2023","private_notes":"","public_notes":"Omnis modi optio maxime ut inventore.","budgeted_hours":339,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":390,"tasks":[],"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000","vat_number":"VAT123"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428466,"start_date":"19\/Nov\/2023 21:11:26","end_date_raw":1700446786,"end_date":"20\/Nov\/2023 02:11:46","description":"Ipsam voluptatum sed officiis eos quo.","billable":true,"duration":18320},{"start_date_raw":1700447086,"start_date":"20\/Nov\/2023 02:11:46","end_date_raw":1700520087,"end_date":"20\/Nov\/2023 22:11:27","description":"Et maxime rem provident veritatis.","billable":true,"duration":73001},{"start_date_raw":1700520387,"start_date":"20\/Nov\/2023 22:11:27","end_date_raw":1700603783,"end_date":"21\/Nov\/2023 21:11:23","description":"Deserunt soluta dolorem harum voluptas necessitatibus eum laborum omnis.","billable":false,"duration":83396},{"start_date_raw":1700604083,"start_date":"21\/Nov\/2023 22:11:23","end_date_raw":1700608497,"end_date":"21\/Nov\/2023 23:11:57","description":"Esse et aperiam nobis dolor voluptas.","billable":true,"duration":4414}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000","vat_number":"VAT123"}},{"number":"0005","description":"Enim fugiat at excepturi voluptate debitis ea. Hic officiis quaerat molestiae ullam minus consequuntur ut. Officiis quas consequatur error quae eveniet. Dolorum aliquam provident aperiam asperiores alias modi quae a.","duration":3230,"rate":"$78.00","rate_raw":"78.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428467,"start_date":"19\/Nov\/2023 21:11:27","end_date_raw":1700431697,"end_date":"19\/Nov\/2023 22:11:17","description":"Repudiandae nam et consequatur consequatur.","billable":false,"duration":3230}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Done","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Schroeder-Beahan","balance":"60576.340000","payment_balance":"0.000000","credit_balance":"0.000000"}},{"number":"0006","description":"Dolor quidem aperiam rerum. Voluptates aut vel ut consequatur. Nam et unde cupiditate qui voluptates voluptatum. Temporibus assumenda enim nam neque.","duration":156986,"rate":"$92.00","rate_raw":"92.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Prof. Noah Jaskolski II","number":"0002","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$52.00","task_rate_raw":"52.000000","due_date":"25\/Nov\/2023","private_notes":"","public_notes":"Mollitia ut vel quam. Quia et aut minus.","budgeted_hours":660,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":57,"tasks":[],"client":{"name":"cypress","balance":"13866.150000","payment_balance":"0.000000","credit_balance":"1013.630000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428467,"start_date":"19\/Nov\/2023 21:11:27","end_date_raw":1700443047,"end_date":"20\/Nov\/2023 01:11:27","description":"Unde sequi dicta corporis odio.","billable":true,"duration":14580},{"start_date_raw":1700443347,"start_date":"20\/Nov\/2023 01:11:27","end_date_raw":1700489146,"end_date":"20\/Nov\/2023 14:11:46","description":"Qui rem id inventore velit corporis vitae.","billable":false,"duration":45799},{"start_date_raw":1700489446,"start_date":"20\/Nov\/2023 14:11:46","end_date_raw":1700514655,"end_date":"20\/Nov\/2023 21:11:55","description":"Rerum repellat unde et blanditiis sunt animi aliquid accusantium.","billable":false,"duration":25209},{"start_date_raw":1700514955,"start_date":"20\/Nov\/2023 21:11:55","end_date_raw":1700515449,"end_date":"20\/Nov\/2023 21:11:09","description":"Quasi velit sit et explicabo quibusdam nam.","billable":true,"duration":494},{"start_date_raw":1700515749,"start_date":"20\/Nov\/2023 21:11:09","end_date_raw":1700586653,"end_date":"21\/Nov\/2023 17:11:53","description":"Numquam eos aut eum est corrupti dolorem et.","billable":false,"duration":70904}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Ready to do","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"cypress","balance":"13866.150000","payment_balance":"0.000000","credit_balance":"1013.630000"}},{"number":"0007","description":"Omnis totam eum sed dolores quod rerum. Ducimus voluptate iste quia dolorum consequatur sint. Velit vitae sint qui molestias. Dolores ea rerum voluptates iusto qui natus beatae.","duration":47670,"rate":"$88.00","rate_raw":"88.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Prof. Noah Jaskolski II","number":"0002","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$52.00","task_rate_raw":"52.000000","due_date":"25\/Nov\/2023","private_notes":"","public_notes":"Mollitia ut vel quam. Quia et aut minus.","budgeted_hours":660,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":57,"tasks":[],"client":{"name":"cypress","balance":"13866.150000","payment_balance":"0.000000","credit_balance":"1013.630000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428467,"start_date":"19\/Nov\/2023 21:11:27","end_date_raw":1700476137,"end_date":"20\/Nov\/2023 10:11:57","description":"Sint laudantium quia eveniet quod nobis occaecati nihil.","billable":false,"duration":47670}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"cypress","balance":"13866.150000","payment_balance":"0.000000","credit_balance":"1013.630000"}},{"number":"0008","description":"Molestiae dolor explicabo et in commodi eveniet. Expedita voluptatibus nihil ut. Et porro cumque nisi omnis maxime accusantium earum.","duration":638322,"rate":"$130.00","rate_raw":"130.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700504838,"end_date":"20\/Nov\/2023 18:11:18","description":"Delectus consequatur esse quaerat vel.","billable":false,"duration":76370},{"start_date_raw":1700505138,"start_date":"20\/Nov\/2023 18:11:18","end_date_raw":1700579924,"end_date":"21\/Nov\/2023 15:11:44","description":"Eveniet culpa qui quo architecto recusandae ut occaecati aut.","billable":true,"duration":74786},{"start_date_raw":1700580224,"start_date":"21\/Nov\/2023 15:11:44","end_date_raw":1700646586,"end_date":"22\/Nov\/2023 09:11:46","description":"Delectus quia officiis vero quia corporis.","billable":true,"duration":66362},{"start_date_raw":1700646886,"start_date":"22\/Nov\/2023 09:11:46","end_date_raw":1700732597,"end_date":"23\/Nov\/2023 09:11:17","description":"Non ut placeat dolorum et.","billable":true,"duration":85711},{"start_date_raw":1700732897,"start_date":"23\/Nov\/2023 09:11:17","end_date_raw":1700740803,"end_date":"23\/Nov\/2023 12:11:03","description":"Numquam natus accusantium voluptatem aliquam maxime fugiat voluptatem.","billable":true,"duration":7906},{"start_date_raw":1700741103,"start_date":"23\/Nov\/2023 12:11:03","end_date_raw":1700807283,"end_date":"24\/Nov\/2023 06:11:03","description":"Quae est ut optio atque fugit non.","billable":false,"duration":66180},{"start_date_raw":1700807583,"start_date":"24\/Nov\/2023 06:11:03","end_date_raw":1700889007,"end_date":"25\/Nov\/2023 05:11:07","description":"Natus voluptas quo id nam iure neque eveniet id.","billable":false,"duration":81424},{"start_date_raw":1700889307,"start_date":"25\/Nov\/2023 05:11:07","end_date_raw":1700949728,"end_date":"25\/Nov\/2023 22:11:08","description":"Sed suscipit voluptatem officia reprehenderit qui occaecati saepe veniam.","billable":false,"duration":60421},{"start_date_raw":1700950028,"start_date":"25\/Nov\/2023 22:11:08","end_date_raw":1700972964,"end_date":"26\/Nov\/2023 04:11:24","description":"Officiis sequi aut natus sapiente.","billable":true,"duration":22936},{"start_date_raw":1700973264,"start_date":"26\/Nov\/2023 04:11:24","end_date_raw":1700986155,"end_date":"26\/Nov\/2023 08:11:15","description":"Et similique odit quasi eaque harum.","billable":false,"duration":12891},{"start_date_raw":1700986455,"start_date":"26\/Nov\/2023 08:11:15","end_date_raw":1701069790,"end_date":"27\/Nov\/2023 07:11:10","description":"Qui magnam vero unde nam dolorem qui.","billable":true,"duration":83335}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Ready to do","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Medhurst Inc","balance":"37633.780000","payment_balance":"0.000000","credit_balance":"1025.100000"}},{"number":"0009","description":"Ipsam numquam nesciunt corporis veritatis vitae porro maiores. Delectus sit itaque dolores. Atque et dolorem nisi est.","duration":439161,"rate":"$120.00","rate_raw":"120.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Mr. Easton Streich","number":"0003","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$153.00","task_rate_raw":"153.000000","due_date":"28\/Nov\/2023","private_notes":"","public_notes":"Debitis sit ut voluptatem eaque veritatis.","budgeted_hours":216,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":496,"tasks":[],"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700434593,"end_date":"19\/Nov\/2023 22:11:33","description":"At unde dolores quasi quia.","billable":true,"duration":6125},{"start_date_raw":1700434893,"start_date":"19\/Nov\/2023 23:11:33","end_date_raw":1700498703,"end_date":"20\/Nov\/2023 16:11:03","description":"Et quae non voluptatum nam quia velit suscipit.","billable":false,"duration":63810},{"start_date_raw":1700499003,"start_date":"20\/Nov\/2023 16:11:03","end_date_raw":1700548104,"end_date":"21\/Nov\/2023 06:11:24","description":"Quidem delectus sed et.","billable":true,"duration":49101},{"start_date_raw":1700548404,"start_date":"21\/Nov\/2023 06:11:24","end_date_raw":1700629022,"end_date":"22\/Nov\/2023 04:11:02","description":"Soluta velit enim explicabo dolorem commodi.","billable":false,"duration":80618},{"start_date_raw":1700629322,"start_date":"22\/Nov\/2023 05:11:02","end_date_raw":1700647716,"end_date":"22\/Nov\/2023 10:11:36","description":"Est magni qui quis.","billable":false,"duration":18394},{"start_date_raw":1700648016,"start_date":"22\/Nov\/2023 10:11:36","end_date_raw":1700731147,"end_date":"23\/Nov\/2023 09:11:07","description":"Saepe aspernatur non molestias dolor ea quos in.","billable":false,"duration":83131},{"start_date_raw":1700731447,"start_date":"23\/Nov\/2023 09:11:07","end_date_raw":1700782753,"end_date":"23\/Nov\/2023 23:11:13","description":"Alias id nihil laboriosam aliquam odio qui excepturi.","billable":true,"duration":51306},{"start_date_raw":1700783053,"start_date":"23\/Nov\/2023 23:11:13","end_date_raw":1700795456,"end_date":"24\/Nov\/2023 03:11:56","description":"Eos numquam et atque quia a qui nesciunt.","billable":false,"duration":12403},{"start_date_raw":1700795756,"start_date":"24\/Nov\/2023 03:11:56","end_date_raw":1700812488,"end_date":"24\/Nov\/2023 07:11:48","description":"Ut voluptas in natus qui.","billable":false,"duration":16732},{"start_date_raw":1700812788,"start_date":"24\/Nov\/2023 07:11:48","end_date_raw":1700842826,"end_date":"24\/Nov\/2023 16:11:26","description":"Est aut magnam ratione.","billable":false,"duration":30038},{"start_date_raw":1700843126,"start_date":"24\/Nov\/2023 16:11:26","end_date_raw":1700870629,"end_date":"25\/Nov\/2023 00:11:49","description":"Exercitationem non odio quasi ut saepe.","billable":true,"duration":27503}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}},{"number":"0010","description":"Quo recusandae optio est saepe consectetur optio. Accusantium eum quia eaque. Voluptatum eligendi similique velit dolor eos rerum cumque quaerat.","duration":425934,"rate":"$98.00","rate_raw":"98.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Mr. Easton Streich","number":"0003","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$153.00","task_rate_raw":"153.000000","due_date":"28\/Nov\/2023","private_notes":"","public_notes":"Debitis sit ut voluptatem eaque veritatis.","budgeted_hours":216,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":496,"tasks":[],"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700463790,"end_date":"20\/Nov\/2023 07:11:10","description":"Culpa aut consequatur earum ut.","billable":false,"duration":35322},{"start_date_raw":1700464090,"start_date":"20\/Nov\/2023 07:11:10","end_date_raw":1700536862,"end_date":"21\/Nov\/2023 03:11:02","description":"Reprehenderit et esse qui hic quia est iusto.","billable":false,"duration":72772},{"start_date_raw":1700537162,"start_date":"21\/Nov\/2023 03:11:02","end_date_raw":1700592394,"end_date":"21\/Nov\/2023 18:11:34","description":"In est enim dolore nesciunt distinctio magni qui.","billable":true,"duration":55232},{"start_date_raw":1700592694,"start_date":"21\/Nov\/2023 18:11:34","end_date_raw":1700635771,"end_date":"22\/Nov\/2023 06:11:31","description":"Est saepe quasi alias aut odit officiis corporis.","billable":true,"duration":43077},{"start_date_raw":1700636071,"start_date":"22\/Nov\/2023 06:11:31","end_date_raw":1700637953,"end_date":"22\/Nov\/2023 07:11:53","description":"Consequuntur ipsa ut voluptate accusamus quibusdam sint sed.","billable":false,"duration":1882},{"start_date_raw":1700638253,"start_date":"22\/Nov\/2023 07:11:53","end_date_raw":1700687668,"end_date":"22\/Nov\/2023 21:11:28","description":"Sunt similique error et nostrum reprehenderit dolor.","billable":false,"duration":49415},{"start_date_raw":1700687968,"start_date":"22\/Nov\/2023 21:11:28","end_date_raw":1700712068,"end_date":"23\/Nov\/2023 04:11:08","description":"Aut rerum quis fugiat nostrum facilis ut.","billable":false,"duration":24100},{"start_date_raw":1700712368,"start_date":"23\/Nov\/2023 04:11:08","end_date_raw":1700783951,"end_date":"23\/Nov\/2023 23:11:11","description":"Aut culpa omnis sint et quos quisquam sint.","billable":true,"duration":71583},{"start_date_raw":1700784251,"start_date":"24\/Nov\/2023 00:11:11","end_date_raw":1700845166,"end_date":"24\/Nov\/2023 16:11:26","description":"Voluptas ut ratione porro eaque iste voluptas.","billable":true,"duration":60915},{"start_date_raw":1700845466,"start_date":"24\/Nov\/2023 17:11:26","end_date_raw":1700857102,"end_date":"24\/Nov\/2023 20:11:22","description":"Qui ipsa minus sed saepe maiores necessitatibus.","billable":true,"duration":11636}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Done","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}},{"number":"0011","description":"Eligendi molestiae et quis et tempora esse ut. Sed ut est possimus et minus aut incidunt. Quibusdam rerum incidunt molestias est qui quam temporibus fuga.","duration":637522,"rate":"$120.00","rate_raw":"120.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Mr. Easton Streich","number":"0003","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$153.00","task_rate_raw":"153.000000","due_date":"28\/Nov\/2023","private_notes":"","public_notes":"Debitis sit ut voluptatem eaque veritatis.","budgeted_hours":216,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":496,"tasks":[],"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700499282,"end_date":"20\/Nov\/2023 16:11:42","description":"Quasi temporibus doloremque consequatur minus pariatur facere.","billable":true,"duration":70814},{"start_date_raw":1700499582,"start_date":"20\/Nov\/2023 16:11:42","end_date_raw":1700584386,"end_date":"21\/Nov\/2023 16:11:06","description":"Id distinctio sed eos qui.","billable":true,"duration":84804},{"start_date_raw":1700584686,"start_date":"21\/Nov\/2023 16:11:06","end_date_raw":1700635554,"end_date":"22\/Nov\/2023 06:11:54","description":"Facere explicabo non nostrum.","billable":true,"duration":50868},{"start_date_raw":1700635854,"start_date":"22\/Nov\/2023 06:11:54","end_date_raw":1700672533,"end_date":"22\/Nov\/2023 17:11:13","description":"Numquam sit labore facere voluptatibus quibusdam reiciendis et.","billable":true,"duration":36679},{"start_date_raw":1700672833,"start_date":"22\/Nov\/2023 17:11:13","end_date_raw":1700678587,"end_date":"22\/Nov\/2023 18:11:07","description":"Perspiciatis ad hic nostrum et.","billable":true,"duration":5754},{"start_date_raw":1700678887,"start_date":"22\/Nov\/2023 18:11:07","end_date_raw":1700708730,"end_date":"23\/Nov\/2023 03:11:30","description":"Qui culpa iure eos quaerat voluptatum numquam inventore.","billable":true,"duration":29843},{"start_date_raw":1700709030,"start_date":"23\/Nov\/2023 03:11:30","end_date_raw":1700765439,"end_date":"23\/Nov\/2023 18:11:39","description":"Similique molestiae atque voluptatem debitis dolorem quos quis et.","billable":false,"duration":56409},{"start_date_raw":1700765739,"start_date":"23\/Nov\/2023 18:11:39","end_date_raw":1700831780,"end_date":"24\/Nov\/2023 13:11:20","description":"Nam dolorum optio et omnis.","billable":true,"duration":66041},{"start_date_raw":1700832080,"start_date":"24\/Nov\/2023 13:11:20","end_date_raw":1700844498,"end_date":"24\/Nov\/2023 16:11:18","description":"Non eos amet repellat tempore id.","billable":false,"duration":12418},{"start_date_raw":1700844798,"start_date":"24\/Nov\/2023 16:11:18","end_date_raw":1700899153,"end_date":"25\/Nov\/2023 07:11:13","description":"Iste neque nostrum laudantium officia.","billable":false,"duration":54355},{"start_date_raw":1700899453,"start_date":"25\/Nov\/2023 08:11:13","end_date_raw":1700971949,"end_date":"26\/Nov\/2023 04:11:29","description":"Ut quia ratione sed et.","billable":true,"duration":72496},{"start_date_raw":1700972249,"start_date":"26\/Nov\/2023 04:11:29","end_date_raw":1700984833,"end_date":"26\/Nov\/2023 07:11:13","description":"Sapiente quia magni quisquam eos rerum rem.","billable":false,"duration":12584},{"start_date_raw":1700985133,"start_date":"26\/Nov\/2023 07:11:13","end_date_raw":1701069590,"end_date":"27\/Nov\/2023 07:11:50","description":"Nulla et ducimus doloribus est.","billable":true,"duration":84457}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Done","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}},{"number":"0012","description":"Ea cumque amet quas et suscipit. Voluptatum libero enim minus necessitatibus qui voluptatem. Voluptates soluta quae in et aut possimus veniam.","duration":283580,"rate":"$78.00","rate_raw":"78.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Mr. Easton Streich","number":"0003","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$153.00","task_rate_raw":"153.000000","due_date":"28\/Nov\/2023","private_notes":"","public_notes":"Debitis sit ut voluptatem eaque veritatis.","budgeted_hours":216,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":496,"tasks":[],"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700469690,"end_date":"20\/Nov\/2023 08:11:30","description":"Placeat vel sit voluptas architecto sed.","billable":true,"duration":41222},{"start_date_raw":1700469990,"start_date":"20\/Nov\/2023 08:11:30","end_date_raw":1700483859,"end_date":"20\/Nov\/2023 12:11:39","description":"Voluptatem est quo est dolorem.","billable":true,"duration":13869},{"start_date_raw":1700484159,"start_date":"20\/Nov\/2023 12:11:39","end_date_raw":1700541376,"end_date":"21\/Nov\/2023 04:11:16","description":"Perferendis nulla quos omnis inventore sint.","billable":false,"duration":57217},{"start_date_raw":1700541676,"start_date":"21\/Nov\/2023 04:11:16","end_date_raw":1700609280,"end_date":"21\/Nov\/2023 23:11:00","description":"Quia quae ad cum neque.","billable":true,"duration":67604},{"start_date_raw":1700609580,"start_date":"21\/Nov\/2023 23:11:00","end_date_raw":1700668490,"end_date":"22\/Nov\/2023 15:11:50","description":"Pariatur et ipsa cumque consequatur voluptatum nemo.","billable":true,"duration":58910},{"start_date_raw":1700668790,"start_date":"22\/Nov\/2023 15:11:50","end_date_raw":1700690815,"end_date":"22\/Nov\/2023 22:11:55","description":"Officia explicabo illo ex tenetur.","billable":true,"duration":22025},{"start_date_raw":1700691115,"start_date":"22\/Nov\/2023 22:11:55","end_date_raw":1700713848,"end_date":"23\/Nov\/2023 04:11:48","description":"Quasi neque tempore aut at.","billable":true,"duration":22733}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Ready to do","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}},{"number":"0013","description":"Enim eveniet rem illo sed voluptatem vero dolorem. Sed consequatur quia autem culpa. Sed perspiciatis ullam non.","duration":512814,"rate":"$145.00","rate_raw":"145.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700442008,"end_date":"20\/Nov\/2023 01:11:08","description":"Et et delectus in rerum fuga et ipsam.","billable":true,"duration":13540},{"start_date_raw":1700442308,"start_date":"20\/Nov\/2023 01:11:08","end_date_raw":1700488304,"end_date":"20\/Nov\/2023 13:11:44","description":"In porro et sed eos.","billable":true,"duration":45996},{"start_date_raw":1700488604,"start_date":"20\/Nov\/2023 13:11:44","end_date_raw":1700529328,"end_date":"21\/Nov\/2023 01:11:28","description":"Eveniet similique sint minima voluptatibus voluptatem sunt.","billable":false,"duration":40724},{"start_date_raw":1700529628,"start_date":"21\/Nov\/2023 01:11:28","end_date_raw":1700560989,"end_date":"21\/Nov\/2023 10:11:09","description":"Ut est fuga id qui ut.","billable":false,"duration":31361},{"start_date_raw":1700561289,"start_date":"21\/Nov\/2023 10:11:09","end_date_raw":1700635644,"end_date":"22\/Nov\/2023 06:11:24","description":"Est consequatur nisi itaque.","billable":false,"duration":74355},{"start_date_raw":1700635944,"start_date":"22\/Nov\/2023 06:11:24","end_date_raw":1700650878,"end_date":"22\/Nov\/2023 11:11:18","description":"Ut vitae et velit magnam aut sed ut.","billable":true,"duration":14934},{"start_date_raw":1700651178,"start_date":"22\/Nov\/2023 11:11:18","end_date_raw":1700672376,"end_date":"22\/Nov\/2023 16:11:36","description":"Id odio laudantium quae similique.","billable":false,"duration":21198},{"start_date_raw":1700672676,"start_date":"22\/Nov\/2023 17:11:36","end_date_raw":1700734868,"end_date":"23\/Nov\/2023 10:11:08","description":"Saepe non vel reiciendis autem quidem quos.","billable":true,"duration":62192},{"start_date_raw":1700735168,"start_date":"23\/Nov\/2023 10:11:08","end_date_raw":1700772446,"end_date":"23\/Nov\/2023 20:11:26","description":"Occaecati commodi cupiditate esse molestiae velit.","billable":true,"duration":37278},{"start_date_raw":1700772746,"start_date":"23\/Nov\/2023 20:11:26","end_date_raw":1700785864,"end_date":"24\/Nov\/2023 00:11:04","description":"Quia et cupiditate expedita cumque quas.","billable":true,"duration":13118},{"start_date_raw":1700786164,"start_date":"24\/Nov\/2023 00:11:04","end_date_raw":1700806681,"end_date":"24\/Nov\/2023 06:11:01","description":"Eos consequatur soluta labore soluta ut.","billable":true,"duration":20517},{"start_date_raw":1700806981,"start_date":"24\/Nov\/2023 06:11:01","end_date_raw":1700839054,"end_date":"24\/Nov\/2023 15:11:34","description":"Impedit vel pariatur dicta necessitatibus at harum eius.","billable":true,"duration":32073},{"start_date_raw":1700839354,"start_date":"24\/Nov\/2023 15:11:34","end_date_raw":1700866888,"end_date":"24\/Nov\/2023 23:11:28","description":"Laboriosam nihil veritatis voluptatum qui laboriosam iusto.","billable":true,"duration":27534},{"start_date_raw":1700867188,"start_date":"24\/Nov\/2023 23:11:28","end_date_raw":1700875021,"end_date":"25\/Nov\/2023 01:11:01","description":"Error accusamus sapiente reiciendis.","billable":true,"duration":7833},{"start_date_raw":1700875321,"start_date":"25\/Nov\/2023 01:11:01","end_date_raw":1700886769,"end_date":"25\/Nov\/2023 04:11:49","description":"Impedit eius consequatur quod qui quod expedita quis.","billable":false,"duration":11448},{"start_date_raw":1700887069,"start_date":"25\/Nov\/2023 04:11:49","end_date_raw":1700945782,"end_date":"25\/Nov\/2023 20:11:22","description":"Tempora omnis nesciunt placeat omnis architecto quis.","billable":true,"duration":58713}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Done","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000","vat_number":"VAT123"}},{"number":"0014","description":"In soluta aliquid et eius. Molestiae veritatis animi culpa et amet porro modi ut. Id sequi nobis itaque modi explicabo voluptatem quam. Non ex voluptatem error aspernatur odit.","duration":346244,"rate":"$70.00","rate_raw":"70.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Elenor Orn","number":"0004","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$39.00","task_rate_raw":"39.000000","due_date":"27\/Nov\/2023","private_notes":"","public_notes":"Distinctio ut voluptas deleniti est sed quae.","budgeted_hours":372,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":331,"tasks":[],"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700458211,"end_date":"20\/Nov\/2023 05:11:11","description":"Voluptate aut dicta recusandae consectetur est ducimus.","billable":false,"duration":29743},{"start_date_raw":1700458511,"start_date":"20\/Nov\/2023 05:11:11","end_date_raw":1700516247,"end_date":"20\/Nov\/2023 21:11:27","description":"Dolores incidunt praesentium rerum.","billable":false,"duration":57736},{"start_date_raw":1700516547,"start_date":"20\/Nov\/2023 21:11:27","end_date_raw":1700549251,"end_date":"21\/Nov\/2023 06:11:31","description":"Perspiciatis consequatur et alias praesentium placeat modi aut.","billable":true,"duration":32704},{"start_date_raw":1700549551,"start_date":"21\/Nov\/2023 06:11:31","end_date_raw":1700618445,"end_date":"22\/Nov\/2023 02:11:45","description":"Esse libero incidunt non rem sunt quisquam repudiandae nisi.","billable":true,"duration":68894},{"start_date_raw":1700618745,"start_date":"22\/Nov\/2023 02:11:45","end_date_raw":1700698086,"end_date":"23\/Nov\/2023 00:11:06","description":"Earum consectetur esse fugit sint autem tempore.","billable":true,"duration":79341},{"start_date_raw":1700698386,"start_date":"23\/Nov\/2023 00:11:06","end_date_raw":1700776212,"end_date":"23\/Nov\/2023 21:11:12","description":"Saepe sit consequatur vel eos ad iusto nobis.","billable":true,"duration":77826}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Ready to do","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}},{"number":"0015","description":"Minus accusamus illum quia nihil voluptatum qui mollitia vel. Natus fugiat sequi quod eius occaecati non. Minus rerum ut eos est eveniet quae iure.","duration":410859,"rate":"$13.00","rate_raw":"13.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Elenor Orn","number":"0004","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$39.00","task_rate_raw":"39.000000","due_date":"27\/Nov\/2023","private_notes":"","public_notes":"Distinctio ut voluptas deleniti est sed quae.","budgeted_hours":372,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":331,"tasks":[],"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428468,"start_date":"19\/Nov\/2023 21:11:28","end_date_raw":1700506053,"end_date":"20\/Nov\/2023 18:11:33","description":"Iste neque officiis eum maiores.","billable":true,"duration":77585},{"start_date_raw":1700506353,"start_date":"20\/Nov\/2023 18:11:33","end_date_raw":1700572042,"end_date":"21\/Nov\/2023 13:11:22","description":"Minus perferendis quia amet.","billable":true,"duration":65689},{"start_date_raw":1700572342,"start_date":"21\/Nov\/2023 13:11:22","end_date_raw":1700637291,"end_date":"22\/Nov\/2023 07:11:51","description":"Commodi quaerat hic minus et voluptas velit.","billable":true,"duration":64949},{"start_date_raw":1700637591,"start_date":"22\/Nov\/2023 07:11:51","end_date_raw":1700649610,"end_date":"22\/Nov\/2023 10:11:10","description":"Vitae rerum natus aperiam quia explicabo.","billable":false,"duration":12019},{"start_date_raw":1700649910,"start_date":"22\/Nov\/2023 10:11:10","end_date_raw":1700693674,"end_date":"22\/Nov\/2023 22:11:34","description":"Quos sunt dolorum eveniet provident ut.","billable":false,"duration":43764},{"start_date_raw":1700693974,"start_date":"22\/Nov\/2023 22:11:34","end_date_raw":1700775335,"end_date":"23\/Nov\/2023 21:11:35","description":"Animi quibusdam quisquam ea error earum consectetur.","billable":true,"duration":81361},{"start_date_raw":1700775635,"start_date":"23\/Nov\/2023 21:11:35","end_date_raw":1700808126,"end_date":"24\/Nov\/2023 06:11:06","description":"Ratione ipsam molestiae dolorem sit architecto voluptas.","billable":true,"duration":32491},{"start_date_raw":1700808426,"start_date":"24\/Nov\/2023 06:11:06","end_date_raw":1700817758,"end_date":"24\/Nov\/2023 09:11:38","description":"Maxime reprehenderit voluptates culpa.","billable":false,"duration":9332},{"start_date_raw":1700818058,"start_date":"24\/Nov\/2023 09:11:38","end_date_raw":1700841727,"end_date":"24\/Nov\/2023 16:11:07","description":"Atque deleniti et laboriosam molestias repellat accusamus omnis.","billable":false,"duration":23669}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}},{"number":"0016","description":"Temporibus illum voluptatibus molestias quia omnis illo molestias corporis. Hic et hic quia dolores quas sint dolorem. Repellendus minus quae fuga illum amet in voluptatum. Rerum mollitia est eum voluptatum architecto non nisi qui. Est et dolores omnis placeat repellat sed facilis.","duration":435319,"rate":"$89.00","rate_raw":"89.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Elenor Orn","number":"0004","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$39.00","task_rate_raw":"39.000000","due_date":"27\/Nov\/2023","private_notes":"","public_notes":"Distinctio ut voluptas deleniti est sed quae.","budgeted_hours":372,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":331,"tasks":[],"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428469,"start_date":"19\/Nov\/2023 21:11:29","end_date_raw":1700496403,"end_date":"20\/Nov\/2023 16:11:43","description":"Sunt unde repellat reiciendis quos porro et dolores.","billable":true,"duration":67934},{"start_date_raw":1700496703,"start_date":"20\/Nov\/2023 16:11:43","end_date_raw":1700551129,"end_date":"21\/Nov\/2023 07:11:49","description":"Voluptatem laborum repudiandae enim asperiores.","billable":false,"duration":54426},{"start_date_raw":1700551429,"start_date":"21\/Nov\/2023 07:11:49","end_date_raw":1700631865,"end_date":"22\/Nov\/2023 05:11:25","description":"Placeat numquam magnam occaecati.","billable":false,"duration":80436},{"start_date_raw":1700632165,"start_date":"22\/Nov\/2023 05:11:25","end_date_raw":1700695854,"end_date":"22\/Nov\/2023 23:11:54","description":"Qui quo et est vero autem reprehenderit.","billable":false,"duration":63689},{"start_date_raw":1700696154,"start_date":"22\/Nov\/2023 23:11:54","end_date_raw":1700736857,"end_date":"23\/Nov\/2023 10:11:17","description":"Et voluptatem distinctio dolor fuga hic ea.","billable":false,"duration":40703},{"start_date_raw":1700737157,"start_date":"23\/Nov\/2023 10:11:17","end_date_raw":1700790692,"end_date":"24\/Nov\/2023 01:11:32","description":"Quo expedita quidem ab dolor quam expedita porro.","billable":true,"duration":53535},{"start_date_raw":1700790992,"start_date":"24\/Nov\/2023 01:11:32","end_date_raw":1700817527,"end_date":"24\/Nov\/2023 09:11:47","description":"Adipisci voluptatem officiis quaerat ut quos facilis.","billable":false,"duration":26535},{"start_date_raw":1700817827,"start_date":"24\/Nov\/2023 09:11:47","end_date_raw":1700865888,"end_date":"24\/Nov\/2023 22:11:48","description":"Tenetur ut dolorem vero.","billable":true,"duration":48061}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Done","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Walsh-Considine","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1960.450000"}},{"number":"0017","description":"Repudiandae nam labore dolores nihil sunt dolorem recusandae rerum. Ut consequatur vel et aut facilis. Sapiente distinctio cupiditate qui repellat ipsum harum.","duration":835159,"rate":"$65.00","rate_raw":"65.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":[],"time_log":[{"start_date_raw":1700428469,"start_date":"19\/Nov\/2023 21:11:29","end_date_raw":1700448921,"end_date":"20\/Nov\/2023 02:11:21","description":"Veniam iusto aperiam quis sunt nihil qui neque.","billable":true,"duration":20452},{"start_date_raw":1700449221,"start_date":"20\/Nov\/2023 03:11:21","end_date_raw":1700480544,"end_date":"20\/Nov\/2023 11:11:24","description":"Molestiae vero ea quis numquam et dicta reprehenderit.","billable":true,"duration":31323},{"start_date_raw":1700480844,"start_date":"20\/Nov\/2023 11:11:24","end_date_raw":1700513241,"end_date":"20\/Nov\/2023 20:11:21","description":"Qui id accusantium eius esse pariatur qui.","billable":false,"duration":32397},{"start_date_raw":1700513541,"start_date":"20\/Nov\/2023 20:11:21","end_date_raw":1700579256,"end_date":"21\/Nov\/2023 15:11:36","description":"Unde porro perspiciatis dolor praesentium dolor.","billable":true,"duration":65715},{"start_date_raw":1700579556,"start_date":"21\/Nov\/2023 15:11:36","end_date_raw":1700631702,"end_date":"22\/Nov\/2023 05:11:42","description":"Laboriosam eligendi deserunt veritatis impedit ipsum rerum voluptas.","billable":false,"duration":52146},{"start_date_raw":1700632002,"start_date":"22\/Nov\/2023 05:11:42","end_date_raw":1700687284,"end_date":"22\/Nov\/2023 21:11:04","description":"Molestiae sint a facere.","billable":true,"duration":55282},{"start_date_raw":1700687584,"start_date":"22\/Nov\/2023 21:11:04","end_date_raw":1700731618,"end_date":"23\/Nov\/2023 09:11:58","description":"Asperiores in repudiandae eligendi sed eveniet sequi quae.","billable":false,"duration":44034},{"start_date_raw":1700731918,"start_date":"23\/Nov\/2023 09:11:58","end_date_raw":1700785496,"end_date":"24\/Nov\/2023 00:11:56","description":"Ratione quia rem odit ea doloremque et.","billable":true,"duration":53578},{"start_date_raw":1700785796,"start_date":"24\/Nov\/2023 00:11:56","end_date_raw":1700814699,"end_date":"24\/Nov\/2023 08:11:39","description":"Deserunt quam alias incidunt sit placeat tenetur.","billable":true,"duration":28903},{"start_date_raw":1700814999,"start_date":"24\/Nov\/2023 08:11:39","end_date_raw":1700889011,"end_date":"25\/Nov\/2023 05:11:11","description":"Libero sed numquam quidem vel esse magni vel laudantium.","billable":false,"duration":74012},{"start_date_raw":1700889311,"start_date":"25\/Nov\/2023 05:11:11","end_date_raw":1700943511,"end_date":"25\/Nov\/2023 20:11:31","description":"Rerum aliquid aliquam error deleniti quo eaque.","billable":true,"duration":54200},{"start_date_raw":1700943811,"start_date":"25\/Nov\/2023 20:11:31","end_date_raw":1701013647,"end_date":"26\/Nov\/2023 15:11:27","description":"Quos vel est rerum nihil id.","billable":false,"duration":69836},{"start_date_raw":1701013947,"start_date":"26\/Nov\/2023 15:11:27","end_date_raw":1701099520,"end_date":"27\/Nov\/2023 15:11:40","description":"Cum quia maxime dignissimos quo.","billable":true,"duration":85573},{"start_date_raw":1701099820,"start_date":"27\/Nov\/2023 15:11:40","end_date_raw":1701163104,"end_date":"28\/Nov\/2023 09:11:24","description":"Amet ea exercitationem quo sed eos corporis.","billable":false,"duration":63284},{"start_date_raw":1701163404,"start_date":"28\/Nov\/2023 09:11:24","end_date_raw":1701220140,"end_date":"29\/Nov\/2023 01:11:00","description":"Sunt voluptas atque odio nesciunt aliquam in earum.","billable":true,"duration":56736},{"start_date_raw":1701220440,"start_date":"29\/Nov\/2023 01:11:00","end_date_raw":1701268128,"end_date":"29\/Nov\/2023 14:11:48","description":"Odio voluptatibus rerum non.","billable":false,"duration":47688}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Hoeger, Hahn and Cole","balance":"0.000000","payment_balance":"0.000000","credit_balance":"1022.550000","vat_number":"VAT123"}},{"number":"0018","description":"Odit rerum iusto quibusdam. A mollitia cupiditate enim consequatur omnis qui voluptas quibusdam. Recusandae et non ut ipsum asperiores non iusto.","duration":312865,"rate":"$95.00","rate_raw":"95.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Maryjane Macejkovic","number":"0005","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$78.00","task_rate_raw":"78.000000","due_date":"26\/Nov\/2023","private_notes":"","public_notes":"Nesciunt est sit ea explicabo.","budgeted_hours":405,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":194,"tasks":[],"client":{"name":"Medhurst Inc","balance":"37633.780000","payment_balance":"0.000000","credit_balance":"1025.100000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428469,"start_date":"19\/Nov\/2023 21:11:29","end_date_raw":1700476677,"end_date":"20\/Nov\/2023 10:11:57","description":"Quam dolores ut dolorem quo sint atque.","billable":true,"duration":48208},{"start_date_raw":1700476977,"start_date":"20\/Nov\/2023 10:11:57","end_date_raw":1700520944,"end_date":"20\/Nov\/2023 22:11:44","description":"Unde minus veniam corporis qui laboriosam suscipit quas.","billable":true,"duration":43967},{"start_date_raw":1700521244,"start_date":"20\/Nov\/2023 23:11:44","end_date_raw":1700602639,"end_date":"21\/Nov\/2023 21:11:19","description":"Beatae molestiae molestias sed dolor recusandae et id eligendi.","billable":false,"duration":81395},{"start_date_raw":1700602939,"start_date":"21\/Nov\/2023 21:11:19","end_date_raw":1700682077,"end_date":"22\/Nov\/2023 19:11:17","description":"Repellendus nam perspiciatis exercitationem in iste officia.","billable":true,"duration":79138},{"start_date_raw":1700682377,"start_date":"22\/Nov\/2023 19:11:17","end_date_raw":1700692054,"end_date":"22\/Nov\/2023 22:11:34","description":"Consequatur quaerat dolor consequuntur aperiam enim reiciendis.","billable":true,"duration":9677},{"start_date_raw":1700692354,"start_date":"22\/Nov\/2023 22:11:34","end_date_raw":1700742834,"end_date":"23\/Nov\/2023 12:11:54","description":"Qui quia ut sed accusantium odit reprehenderit quaerat.","billable":true,"duration":50480}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Medhurst Inc","balance":"37633.780000","payment_balance":"0.000000","credit_balance":"1025.100000"}},{"number":"0019","description":"Eius et dolor libero repellendus iste. Nemo sit error sed necessitatibus architecto et. Aspernatur omnis doloremque animi quas sed.","duration":387217,"rate":"$87.00","rate_raw":"87.000000","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","date":"19\/Nov\/2023","project":{"name":"Maryjane Macejkovic","number":"0005","created_at":"19\/Nov\/2023","updated_at":"19\/Nov\/2023","task_rate":"$78.00","task_rate_raw":"78.000000","due_date":"26\/Nov\/2023","private_notes":"","public_notes":"Nesciunt est sit ea explicabo.","budgeted_hours":405,"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","color":"#fff","current_hours":194,"tasks":[],"client":{"name":"Medhurst Inc","balance":"37633.780000","payment_balance":"0.000000","credit_balance":"1025.100000"},"user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"}},"time_log":[{"start_date_raw":1700428469,"start_date":"19\/Nov\/2023 21:11:29","end_date_raw":1700434042,"end_date":"19\/Nov\/2023 22:11:22","description":"Aut aliquam totam in reprehenderit sint suscipit earum.","billable":false,"duration":5573},{"start_date_raw":1700434342,"start_date":"19\/Nov\/2023 22:11:22","end_date_raw":1700467844,"end_date":"20\/Nov\/2023 08:11:44","description":"Hic aliquid natus est.","billable":false,"duration":33502},{"start_date_raw":1700468144,"start_date":"20\/Nov\/2023 08:11:44","end_date_raw":1700532877,"end_date":"21\/Nov\/2023 02:11:37","description":"Illo atque dolores eligendi minus et ut consequuntur.","billable":false,"duration":64733},{"start_date_raw":1700533177,"start_date":"21\/Nov\/2023 02:11:37","end_date_raw":1700619369,"end_date":"22\/Nov\/2023 02:11:09","description":"Libero ipsa eligendi sit dolor eligendi quibusdam dicta tenetur.","billable":false,"duration":86192},{"start_date_raw":1700619669,"start_date":"22\/Nov\/2023 02:11:09","end_date_raw":1700646879,"end_date":"22\/Nov\/2023 09:11:39","description":"Dolor unde assumenda blanditiis tenetur blanditiis ipsam quis.","billable":true,"duration":27210},{"start_date_raw":1700647179,"start_date":"22\/Nov\/2023 09:11:39","end_date_raw":1700704537,"end_date":"23\/Nov\/2023 01:11:37","description":"Reprehenderit possimus nisi recusandae.","billable":true,"duration":57358},{"start_date_raw":1700704837,"start_date":"23\/Nov\/2023 02:11:37","end_date_raw":1700733175,"end_date":"23\/Nov\/2023 09:11:55","description":"Aut saepe sint qui magni.","billable":false,"duration":28338},{"start_date_raw":1700733475,"start_date":"23\/Nov\/2023 09:11:55","end_date_raw":1700735626,"end_date":"23\/Nov\/2023 10:11:46","description":"Facere repellendus voluptas illo a.","billable":true,"duration":2151},{"start_date_raw":1700735926,"start_date":"23\/Nov\/2023 10:11:46","end_date_raw":1700769798,"end_date":"23\/Nov\/2023 20:11:18","description":"Voluptatem praesentium ipsum soluta earum.","billable":false,"duration":33872},{"start_date_raw":1700770098,"start_date":"23\/Nov\/2023 20:11:18","end_date_raw":1700818386,"end_date":"24\/Nov\/2023 09:11:06","description":"Dicta eum quis dicta quae.","billable":true,"duration":48288}],"custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","status":"Backlog","user":{"name":"Laron Weissnat Danika Flatley","email":"small@example.com"},"client":{"name":"Medhurst Inc","balance":"37633.780000","payment_balance":"0.000000","credit_balance":"1025.100000"}}]'; public string $invoice_data = '[{"amount":"$6,054.13","balance":"$0.00","amount_raw":"6054.13","balance_raw":"0.000000","number":"0015","discount":1,"po_number":"","date":"20\/Sep\/2023","last_sent_date":"","next_send_date":"","due_date":"","terms":"","public_notes":"","private_notes":"","uses_inclusive_taxes":false,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"total_taxes":"$444.13","total_taxes_raw":"444.130000","is_amount_discount":true,"footer":"","partial":"0.000000","partial_due_date":"","custom_value1":"1984-10-01","custom_value2":"no","custom_value3":"","custom_value4":"","custom_surcharge1":0,"custom_surcharge2":0,"custom_surcharge3":0,"custom_surcharge4":0,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$981.75","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$46.75","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":981.75,"tax_amount_raw":46.75,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$935.00","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$0.00","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":935,"tax_amount_raw":0,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,028.50","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$93.50","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1028.5,"tax_amount_raw":93.5,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"VAT","tax_rate1":17.5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,098.63","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$163.63","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1098.63,"tax_amount_raw":163.63,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,028.50","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$93.50","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1028.5,"tax_amount_raw":93.5,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$981.75","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$46.75","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":981.75,"tax_amount_raw":46.75,"product_cost_raw":0}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$6,054.13","auto_bill_enabled":false,"client":{"name":"Lowe-Paucek","balance":"38124.670000","payment_balance":"0.000000","credit_balance":"2270.590000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$6,054.13","applied":"$6,054.13","balance":"$0.00","refunded":"$0.00","amount_raw":"6054.130000","applied_raw":"6054.130000","refunded_raw":"0.000000","balance_raw":0,"date":"30\/Sep\/2023","method":"","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0008","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Lowe-Paucek","balance":"38124.670000","payment_balance":"0.000000","credit_balance":"2270.590000"},"paymentables":[{"invoice":"0015","amount_raw":"6054.1300","refunded_raw":"0.0000","net_raw":6054.13,"amount":"$6,054.13","refunded":"$0.00","net":"$6,054.13","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696151008}]}],"total_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}],"line_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}]},{"amount":"$3,132.25","amount_raw":"3132.25","balance":"$0.00","balance_raw":"0.000000","number":"0016","discount":0,"po_number":"","date":"17\/Jul\/2023","last_sent_date":"","next_send_date":"","due_date":"","terms":"","public_notes":"","private_notes":"","uses_inclusive_taxes":false,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"CA Sales Tax","tax_rate3":5,"total_taxes":"$327.25","total_taxes_raw":"327.250000","is_amount_discount":true,"footer":"","partial":"0.000000","partial_due_date":"","custom_value1":"1990-05-13","custom_value2":"yes","custom_value3":"","custom_value4":"","custom_surcharge1":0,"custom_surcharge2":0,"custom_surcharge3":0,"custom_surcharge4":0,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$981.75","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$46.75","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":981.75,"tax_amount_raw":46.75,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,028.50","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$93.50","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1028.5,"tax_amount_raw":93.5,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$981.75","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$46.75","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":981.75,"tax_amount_raw":46.75,"product_cost_raw":0}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$3,132.25","auto_bill_enabled":false,"client":{"name":"cypress","balance":"0.000000","payment_balance":"0.000000","credit_balance":"11661.820000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$3,132.25","applied":"$3,132.25","balance":"$0.00","refunded":"$0.00","amount_raw":"3132.250000","applied_raw":"3132.250000","refunded_raw":"0.000000","balance_raw":0,"date":"30\/Sep\/2023","method":"","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0009","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"cypress","balance":"0.000000","payment_balance":"0.000000","credit_balance":"11661.820000"},"paymentables":[{"invoice":"0016","amount_raw":"3132.2500","refunded_raw":"0.0000","net_raw":3132.25,"amount":"$3,132.25","refunded":"$0.00","net":"$3,132.25","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696151008}]}],"total_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}],"line_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}]},{"amount":"$9,396.77","amount_raw":"9396.77","balance":"$0.00","balance_raw":"0.000000","number":"0017","discount":0,"po_number":"","date":"04\/Sep\/2023","last_sent_date":"","next_send_date":"","due_date":"","terms":"","public_notes":"","private_notes":"","uses_inclusive_taxes":false,"tax_name1":"GST","tax_rate1":10,"tax_name2":"VAT","tax_rate2":17.5,"tax_name3":"CA Sales Tax","tax_rate3":5,"total_taxes":"$2,851.77","total_taxes_raw":"2851.770000","is_amount_discount":true,"footer":"","partial":"0.000000","partial_due_date":"","custom_value1":"1989-04-20","custom_value2":"yes","custom_value3":"","custom_value4":"","custom_surcharge1":0,"custom_surcharge2":0,"custom_surcharge3":0,"custom_surcharge4":0,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$981.75","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$46.75","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":981.75,"tax_amount_raw":46.75,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$935.00","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$0.00","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":935,"tax_amount_raw":0,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"VAT","tax_rate1":17.5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,098.63","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$163.63","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1098.63,"tax_amount_raw":163.63,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,028.50","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$93.50","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1028.5,"tax_amount_raw":93.5,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"VAT","tax_rate1":17.5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,098.63","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$163.63","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1098.63,"tax_amount_raw":163.63,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,028.50","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$93.50","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1028.5,"tax_amount_raw":93.5,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"VAT","tax_rate1":17.5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,098.63","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$163.63","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1098.63,"tax_amount_raw":163.63,"product_cost_raw":0}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$9,396.77","auto_bill_enabled":false,"client":{"name":"cypress","balance":"0.000000","payment_balance":"0.000000","credit_balance":"11661.820000"},"payments":[{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$9,396.77","applied":"$9,396.77","balance":"$0.00","refunded":"$0.00","amount_raw":"9396.770000","applied_raw":"9396.770000","refunded_raw":"0.000000","balance_raw":0,"date":"30\/Sep\/2023","method":"","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0010","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"cypress","balance":"0.000000","payment_balance":"0.000000","credit_balance":"11661.820000"},"paymentables":[{"invoice":"0017","amount_raw":"9396.7700","refunded_raw":"0.0000","net_raw":9396.77,"amount":"$9,396.77","refunded":"$0.00","net":"$9,396.77","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696151008}]}],"total_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}],"line_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}]},{"amount":"$6,077.51","balance":"$0.00","amount_raw":"6077.51","balance_raw":"0.000000","number":"0019","discount":0,"po_number":"","date":"01\/Aug\/2023","last_sent_date":"","next_send_date":"","due_date":"","terms":"","public_notes":"","private_notes":"","uses_inclusive_taxes":false,"tax_name1":"","tax_rate1":0,"tax_name2":"VAT","tax_rate2":17.5,"tax_name3":"CA Sales Tax","tax_rate3":5,"total_taxes":"$1,402.51","total_taxes_raw":"1402.510000","is_amount_discount":true,"footer":"","partial":"0.000000","partial_due_date":"","custom_value1":"1992-08-20","custom_value2":"no","custom_value3":"","custom_value4":"","custom_surcharge1":0,"custom_surcharge2":0,"custom_surcharge3":0,"custom_surcharge4":0,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$981.75","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$46.75","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":981.75,"tax_amount_raw":46.75,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,028.50","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$93.50","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1028.5,"tax_amount_raw":93.5,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"VAT","tax_rate1":17.5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,098.63","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$163.63","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1098.63,"tax_amount_raw":163.63,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$981.75","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$46.75","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":981.75,"tax_amount_raw":46.75,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$935.00","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$0.00","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":935,"tax_amount_raw":0,"product_cost_raw":0}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$6,077.51","auto_bill_enabled":false,"client":{"name":"cypress","balance":"0.000000","payment_balance":"0.000000","credit_balance":"11661.820000"},"payments":[{"status":"Refunded","badge":"
Refunded<\/span><\/h6>","amount":"$6,077.51","applied":"$6,077.51","balance":"-$6,077.51","refunded":"$6,077.51","amount_raw":"6077.510000","applied_raw":"6077.510000","refunded_raw":"6077.510000","balance_raw":-6077.51,"date":"30\/Sep\/2023","method":"EuroCard","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0001","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"cypress","balance":"0.000000","payment_balance":"0.000000","credit_balance":"11661.820000"},"paymentables":[{"invoice":"0019","amount_raw":"6077.5100","refunded_raw":"6077.5100","net_raw":0,"amount":"$6,077.51","refunded":"$6,077.51","net":"$0.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]},{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$6,077.51","applied":"$6,077.51","balance":"$0.00","refunded":"$0.00","amount_raw":"6077.510000","applied_raw":"6077.510000","refunded_raw":"0.000000","balance_raw":0,"date":"30\/Sep\/2023","method":"","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0011","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"cypress","balance":"0.000000","payment_balance":"0.000000","credit_balance":"11661.820000"},"paymentables":[{"invoice":"0019","amount_raw":"6077.5100","refunded_raw":"0.0000","net_raw":6077.51,"amount":"$6,077.51","refunded":"$0.00","net":"$6,077.51","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696151008}]}],"total_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}],"line_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}]},{"amount":"$4,090.64","amount_raw":"4090.64","balance":"$0.00","balance_raw":"0.000000","number":"0020","discount":0,"po_number":"","date":"26\/Aug\/2023","last_sent_date":"","next_send_date":"","due_date":"","terms":"","public_notes":"","private_notes":"","uses_inclusive_taxes":false,"tax_name1":"GST","tax_rate1":10,"tax_name2":"VAT","tax_rate2":17.5,"tax_name3":"CA Sales Tax","tax_rate3":5,"total_taxes":"$1,285.64","total_taxes_raw":"1285.640000","is_amount_discount":true,"footer":"","partial":"0.000000","partial_due_date":"","custom_value1":"1979-06-26","custom_value2":"yes","custom_value3":"","custom_value4":"","custom_surcharge1":0,"custom_surcharge2":0,"custom_surcharge3":0,"custom_surcharge4":0,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$981.75","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$46.75","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":981.75,"tax_amount_raw":46.75,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"VAT","tax_rate1":17.5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,098.63","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$163.63","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1098.63,"tax_amount_raw":163.63,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"VAT","tax_rate1":17.5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,098.63","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$163.63","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1098.63,"tax_amount_raw":163.63,"product_cost_raw":0}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$4,090.64","auto_bill_enabled":false,"client":{"name":"cypress","balance":"0.000000","payment_balance":"0.000000","credit_balance":"11661.820000"},"payments":[{"status":"Refunded","badge":"
Refunded<\/span><\/h6>","amount":"$4,090.64","applied":"$4,090.64","balance":"-$4,090.64","refunded":"$4,090.64","amount_raw":"4090.640000","applied_raw":"4090.640000","refunded_raw":"4090.640000","balance_raw":-4090.64,"date":"30\/Sep\/2023","method":"Discover Card","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0002","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"cypress","balance":"0.000000","payment_balance":"0.000000","credit_balance":"11661.820000"},"paymentables":[{"invoice":"0020","amount_raw":"4090.6400","refunded_raw":"4090.6400","net_raw":0,"amount":"$4,090.64","refunded":"$4,090.64","net":"$0.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]},{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$4,090.64","applied":"$4,090.64","balance":"$0.00","refunded":"$0.00","amount_raw":"4090.640000","applied_raw":"4090.640000","refunded_raw":"0.000000","balance_raw":0,"date":"30\/Sep\/2023","method":"","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0012","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"cypress","balance":"0.000000","payment_balance":"0.000000","credit_balance":"11661.820000"},"paymentables":[{"invoice":"0020","amount_raw":"4090.6400","refunded_raw":"0.0000","net_raw":4090.64,"amount":"$4,090.64","refunded":"$0.00","net":"$4,090.64","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696151008}]}],"total_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}],"line_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}]},{"amount":"$2,197.26","amount_raw":"2197.26","balance":"$0.00","balance_raw":"0.000000","number":"0021","discount":0,"po_number":"","date":"08\/Sep\/2023","last_sent_date":"","next_send_date":"","due_date":"","terms":"","public_notes":"","private_notes":"","uses_inclusive_taxes":false,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"total_taxes":"$327.26","total_taxes_raw":"327.260000","is_amount_discount":true,"footer":"","partial":"0.000000","partial_due_date":"","custom_value1":"1980-11-12","custom_value2":"no","custom_value3":"","custom_value4":"","custom_surcharge1":0,"custom_surcharge2":0,"custom_surcharge3":0,"custom_surcharge4":0,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"VAT","tax_rate1":17.5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,098.63","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$163.63","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1098.63,"tax_amount_raw":163.63,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"VAT","tax_rate1":17.5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,098.63","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$163.63","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1098.63,"tax_amount_raw":163.63,"product_cost_raw":0}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$2,197.26","auto_bill_enabled":false,"client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000"},"payments":[{"status":"Refunded","badge":"
Refunded<\/span><\/h6>","amount":"$2,197.26","applied":"$2,197.26","balance":"-$2,197.26","refunded":"$2,197.26","amount_raw":"2197.260000","applied_raw":"2197.260000","refunded_raw":"2197.260000","balance_raw":-2197.26,"date":"30\/Sep\/2023","method":"Diners Card","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0003","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000"},"paymentables":[{"invoice":"0021","amount_raw":"2197.2600","refunded_raw":"2197.2600","net_raw":0,"amount":"$2,197.26","refunded":"$2,197.26","net":"$0.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]},{"status":"Completed","badge":"
Completed<\/span><\/h6>","amount":"$2,197.26","applied":"$2,197.26","balance":"$0.00","refunded":"$0.00","amount_raw":"2197.260000","applied_raw":"2197.260000","refunded_raw":"0.000000","balance_raw":0,"date":"30\/Sep\/2023","method":"","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0013","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000"},"paymentables":[{"invoice":"0021","amount_raw":"2197.2600","refunded_raw":"0.0000","net_raw":2197.26,"amount":"$2,197.26","refunded":"$0.00","net":"$2,197.26","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696151008}]}],"total_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}],"line_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}]},{"amount":"$4,955.50","amount_raw":"4955.50","balance":"$66.00","balance_raw":"66.000000","number":"0022","discount":0,"po_number":"","date":"27\/Sep\/2023","last_sent_date":"","next_send_date":"","due_date":"","terms":"","public_notes":"","private_notes":"","uses_inclusive_taxes":false,"tax_name1":"GST","tax_rate1":10,"tax_name2":"VAT","tax_rate2":17.5,"tax_name3":"","tax_rate3":0,"total_taxes":"$1,215.50","total_taxes_raw":"1215.500000","is_amount_discount":true,"footer":"","partial":"0.000000","partial_due_date":"","custom_value1":"1999-08-20","custom_value2":"yes","custom_value3":"","custom_value4":"","custom_surcharge1":0,"custom_surcharge2":0,"custom_surcharge3":0,"custom_surcharge4":0,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$981.75","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$46.75","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":981.75,"tax_amount_raw":46.75,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$981.75","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$46.75","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":981.75,"tax_amount_raw":46.75,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$981.75","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$46.75","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":981.75,"tax_amount_raw":46.75,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$981.75","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$46.75","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":981.75,"tax_amount_raw":46.75,"product_cost_raw":0}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$4,889.50","auto_bill_enabled":false,"client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000"},"payments":[{"status":"Partially Refunded","badge":"
Partially Refunded<\/span><\/h6>","amount":"$4,955.50","applied":"$4,955.50","balance":"-$66.00","refunded":"$66.00","amount_raw":"4955.500000","applied_raw":"4955.500000","refunded_raw":"66.000000","balance_raw":-66,"date":"30\/Sep\/2023","method":"Maestro","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0004","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000"},"paymentables":[{"invoice":"0022","amount_raw":"4955.5000","refunded_raw":"66.0000","net_raw":4889.5,"amount":"$4,955.50","refunded":"$66.00","net":"$4,889.50","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]}],"total_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}],"line_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}]},{"amount":"$2,290.75","amount_raw":"2290.75","balance":"$34.00","balance_raw":"34.000000","number":"0023","discount":0,"po_number":"","date":"30\/Aug\/2023","last_sent_date":"","next_send_date":"","due_date":"","terms":"","public_notes":"","private_notes":"","uses_inclusive_taxes":false,"tax_name1":"","tax_rate1":0,"tax_name2":"VAT","tax_rate2":17.5,"tax_name3":"CA Sales Tax","tax_rate3":5,"total_taxes":"$420.75","total_taxes_raw":"420.750000","is_amount_discount":true,"footer":"","partial":"0.000000","partial_due_date":"","custom_value1":"2015-12-15","custom_value2":"no","custom_value3":"","custom_value4":"","custom_surcharge1":0,"custom_surcharge2":0,"custom_surcharge3":0,"custom_surcharge4":0,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$935.00","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$0.00","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":935,"tax_amount_raw":0,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$935.00","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$0.00","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":935,"tax_amount_raw":0,"product_cost_raw":0}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$2,256.75","auto_bill_enabled":false,"client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000"},"payments":[{"status":"Partially Refunded","badge":"
Partially Refunded<\/span><\/h6>","amount":"$2,290.75","applied":"$2,290.75","balance":"-$34.00","refunded":"$34.00","amount_raw":"2290.750000","applied_raw":"2290.750000","refunded_raw":"34.000000","balance_raw":-34,"date":"30\/Sep\/2023","method":"Diners Card","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0005","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000"},"paymentables":[{"invoice":"0023","amount_raw":"2290.7500","refunded_raw":"34.0000","net_raw":2256.75,"amount":"$2,290.75","refunded":"$34.00","net":"$2,256.75","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]}],"total_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}],"line_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}]},{"amount":"$6,802.13","amount_raw":"6802.13","balance":"$444.00","balance_raw":"444.000000","number":"0024","discount":0,"po_number":"","date":"25\/Jul\/2023","last_sent_date":"","next_send_date":"","due_date":"","terms":"","public_notes":"","private_notes":"","uses_inclusive_taxes":false,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"CA Sales Tax","tax_rate3":5,"total_taxes":"$1,192.13","total_taxes_raw":"1192.130000","is_amount_discount":true,"footer":"","partial":"0.000000","partial_due_date":"","custom_value1":"1990-07-11","custom_value2":"no","custom_value3":"","custom_value4":"","custom_surcharge1":0,"custom_surcharge2":0,"custom_surcharge3":0,"custom_surcharge4":0,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"VAT","tax_rate1":17.5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,098.63","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$163.63","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1098.63,"tax_amount_raw":163.63,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$935.00","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$0.00","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":935,"tax_amount_raw":0,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$981.75","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$46.75","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":981.75,"tax_amount_raw":46.75,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$935.00","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$0.00","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":935,"tax_amount_raw":0,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$981.75","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$46.75","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":981.75,"tax_amount_raw":46.75,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,028.50","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$93.50","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1028.5,"tax_amount_raw":93.5,"product_cost_raw":0}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$6,358.13","auto_bill_enabled":false,"client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000"},"payments":[{"status":"Partially Refunded","badge":"
Partially Refunded<\/span><\/h6>","amount":"$6,802.13","applied":"$6,802.13","balance":"-$444.00","refunded":"$444.00","amount_raw":"6802.130000","applied_raw":"6802.130000","refunded_raw":"444.000000","balance_raw":-444,"date":"30\/Sep\/2023","method":"Maestro","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0006","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000"},"paymentables":[{"invoice":"0024","amount_raw":"6802.1300","refunded_raw":"444.0000","net_raw":6358.13,"amount":"$6,802.13","refunded":"$444.00","net":"$6,358.13","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]}],"total_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}],"line_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}]},{"amount":"$10,986.26","amount_raw":"10986.26","balance":"$146.26","balance_raw":"146.260000","number":"0025","discount":0,"po_number":"","date":"23\/Jul\/2023","last_sent_date":"","next_send_date":"","due_date":"","terms":"","public_notes":"","private_notes":"","uses_inclusive_taxes":false,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"total_taxes":"$1,636.26","total_taxes_raw":"1636.260000","is_amount_discount":true,"footer":"","partial":"0.000000","partial_due_date":"","custom_value1":"1975-02-18","custom_value2":"no","custom_value3":"","custom_value4":"","custom_surcharge1":0,"custom_surcharge2":0,"custom_surcharge3":0,"custom_surcharge4":0,"exchange_rate":1,"custom_surcharge_tax1":false,"custom_surcharge_tax2":false,"custom_surcharge_tax3":false,"custom_surcharge_tax4":false,"line_items":[{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"VAT","tax_rate1":17.5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,098.63","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$163.63","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1098.63,"tax_amount_raw":163.63,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,028.50","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$93.50","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1028.5,"tax_amount_raw":93.5,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$935.00","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$0.00","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":935,"tax_amount_raw":0,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"","tax_rate1":0,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$935.00","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$0.00","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":935,"tax_amount_raw":0,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"VAT","tax_rate1":17.5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,098.63","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$163.63","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1098.63,"tax_amount_raw":163.63,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$981.75","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$46.75","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":981.75,"tax_amount_raw":46.75,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$981.75","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$46.75","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":981.75,"tax_amount_raw":46.75,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$981.75","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$46.75","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":981.75,"tax_amount_raw":46.75,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"Sales Tax","tax_rate1":5,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$981.75","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$46.75","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":981.75,"tax_amount_raw":46.75,"product_cost_raw":0},{"quantity":1,"cost":"$935.00","product_key":"Et.","notes":"Illum similique.","discount":"$0.00","is_amount_discount":true,"tax_name1":"GST","tax_rate1":10,"tax_name2":"","tax_rate2":0,"tax_name3":"","tax_rate3":0,"sort_id":0,"line_total":"$935.00","gross_line_total":"$1,028.50","custom_value1":"https:\/\/picsum.photos\/200","custom_value2":"78","custom_value3":"Itaque laudantium.","custom_value4":"Qui voluptatem ea a.","type_id":"1","product_cost":"$0.00","tax_amount":"$93.50","date":"","tax_id":"","task_id":"","expense_id":"","cost_raw":935,"discount_raw":0,"line_total_raw":935,"gross_line_total_raw":1028.5,"tax_amount_raw":93.5,"product_cost_raw":0}],"reminder1_sent":"","reminder2_sent":"","reminder3_sent":"","reminder_last_sent":"","paid_to_date":"$10,840.00","auto_bill_enabled":false,"client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000"},"payments":[{"status":"Partially Refunded","badge":"
Partially Refunded<\/span><\/h6>","amount":"$10,986.26","applied":"$10,986.26","balance":"-$146.26","refunded":"$146.26","amount_raw":"10986.260000","applied_raw":"10986.260000","refunded_raw":"146.260000","balance_raw":-146.26000000000022,"date":"30\/Sep\/2023","method":"UnionPay","currency":"USD","exchange_rate":1,"transaction_reference":"Manual entry","is_manual":1,"number":"0007","custom_value1":"","custom_value2":"","custom_value3":"","custom_value4":"","client":{"name":"Jakubowski Group","balance":"28296.170000","payment_balance":"0.000000","credit_balance":"1084.840000"},"paymentables":[{"invoice":"0025","amount_raw":"10986.2600","refunded_raw":"146.2600","net_raw":10840,"amount":"$10,986.26","refunded":"$146.26","net":"$10,840.00","is_credit":false,"created_at":"01\/Oct\/2023","updated_at":"01\/Oct\/2023","timestamp":1696150843}]}],"total_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}],"line_tax_map":[{"name":"CA Sales Tax 5%","total":"$141.90","total_raw":141.9}]}]'; diff --git a/app/Services/Template/TemplateService.php b/app/Services/Template/TemplateService.php index 4c8134d76e48..4ff42546c588 100644 --- a/app/Services/Template/TemplateService.php +++ b/app/Services/Template/TemplateService.php @@ -102,6 +102,12 @@ class TemplateService }); $this->twig->addFunction($function); + $function = new \Twig\TwigFunction('t', function ($string) { + return ctrans("texts.{$string}"); + }); + + $this->twig->addFunction($function); + $filter = new \Twig\TwigFilter('sum', function (?array $array, ?string $column) { if(!is_array($array)) { @@ -408,6 +414,9 @@ class TemplateService default => $processed = [], }; + nlog($key); + nlog($processed); + return $processed; })->toArray(); @@ -519,6 +528,7 @@ class TemplateService 'balance' => $invoice->client->balance, 'payment_balance' => $invoice->client->payment_balance, 'credit_balance' => $invoice->client->credit_balance, + 'vat_number' => $invoice->client->vat_number ?? '', ], 'payments' => $payments, 'total_tax_map' => $invoice->calc()->getTotalTaxMap(), @@ -643,6 +653,7 @@ class TemplateService 'balance' => $payment->client->balance, 'payment_balance' => $payment->client->payment_balance, 'credit_balance' => $payment->client->credit_balance, + 'vat_number' => $payment->client->vat_number ?? '', ], 'paymentables' => $pivot, 'refund_activity' => $this->getPaymentRefundActivity($payment), @@ -719,6 +730,7 @@ class TemplateService 'balance' => $quote->client->balance, 'payment_balance' => $quote->client->payment_balance, 'credit_balance' => $quote->client->credit_balance, + 'vat_number' => $quote->client->vat_number ?? '', ], 'status_id' =>$quote->status_id, 'status' => Quote::stringStatus($quote->status_id), @@ -837,6 +849,7 @@ class TemplateService 'balance' => $credit->client->balance, 'payment_balance' => $credit->client->payment_balance, 'credit_balance' => $credit->client->credit_balance, + 'vat_number' => $credit->client->vat_number ?? '', ], 'payments' => [], 'total_tax_map' => $credit->calc()->getTotalTaxMap(), @@ -900,6 +913,7 @@ class TemplateService 'balance' => $task->client->balance, 'payment_balance' => $task->client->payment_balance, 'credit_balance' => $task->client->credit_balance, + 'vat_number' => $task->client->vat_number ?? '', ] : [], ]; @@ -960,6 +974,7 @@ class TemplateService 'balance' => $project->client->balance, 'payment_balance' => $project->client->payment_balance, 'credit_balance' => $project->client->credit_balance, + 'vat_number' => $project->client->vat_number ?? '', ] : [], 'user' => $this->userInfo($project->user) ]; @@ -979,6 +994,7 @@ class TemplateService return [ 'vendor' => $purchase_order->vendor ? [ 'name' => $purchase_order->vendor->present()->name(), + 'vat_number' => $purchase_order->vendor->vat_number ?? '', ] : [], 'amount' => (float)$purchase_order->amount, 'balance' => (float)$purchase_order->balance, @@ -987,6 +1003,7 @@ class TemplateService 'balance' => $purchase_order->client->balance, 'payment_balance' => $purchase_order->client->payment_balance, 'credit_balance' => $purchase_order->client->credit_balance, + 'vat_number' => $purchase_order->client->vat_number ?? '', ] : [], 'status_id' => (string)($purchase_order->status_id ?: 1), 'status' => PurchaseOrder::stringStatus($purchase_order->status_id ?? 1), @@ -1201,7 +1218,7 @@ class TemplateService $this->client = $this->entity->client; $shipping_address = [ - ['element' => 'p', 'content' => ctrans('texts.shipping_address'), 'properties' => ['data-ref' => 'shipping_address-label', 'style' => 'font-weight: bold; text-transform: uppercase']], + // ['element' => 'p', 'content' => ctrans('texts.shipping_address'), 'properties' => ['data-ref' => 'shipping_address-label', 'style' => 'font-weight: bold; text-transform: uppercase']], ['element' => 'p', 'content' => $this->client->name, 'show_empty' => false, 'properties' => ['data-ref' => 'shipping_address-client.name']], ['element' => 'p', 'content' => $this->client->shipping_address1, 'show_empty' => false, 'properties' => ['data-ref' => 'shipping_address-client.shipping_address1']], ['element' => 'p', 'content' => $this->client->shipping_address2, 'show_empty' => false, 'properties' => ['data-ref' => 'shipping_address-client.shipping_address2']], diff --git a/app/Utils/HtmlEngine.php b/app/Utils/HtmlEngine.php index 041ce9515506..e21fee56447a 100644 --- a/app/Utils/HtmlEngine.php +++ b/app/Utils/HtmlEngine.php @@ -131,16 +131,22 @@ class HtmlEngine // $data['$show_shipping_address_visibility'] = ['value' => $this->settings?->show_shipping_address ? 'visible' : 'hidden', 'label' => '']; $data['$show_shipping_address_visibility'] = ['value' => $this->settings?->show_shipping_address ? 1 : 0, 'label' => '']; + $data['$order_number'] = ['value' => '', 'label' => ctrans('texts.order_number')]; $data['$tax'] = ['value' => '', 'label' => ctrans('texts.tax')]; + $data['$quantity'] = ['value' => '', 'label' => ctrans('texts.quantity')]; + $data['$amount_paid'] = ['value' => '', 'label' => ctrans('texts.amount_paid')]; $data['$app_url'] = ['value' => $this->generateAppUrl(), 'label' => '']; $data['$from'] = ['value' => '', 'label' => ctrans('texts.from')]; $data['$to'] = ['value' => '', 'label' => ctrans('texts.to')]; + $data['$ship_to'] = ['value' => '', 'label' => ctrans('texts.ship_to')]; $data['$total_tax_labels'] = ['value' => $this->totalTaxLabels(), 'label' => ctrans('texts.taxes')]; $data['$total_tax_values'] = ['value' => $this->totalTaxValues(), 'label' => ctrans('texts.taxes')]; $data['$line_tax_labels'] = ['value' => $this->lineTaxLabels(), 'label' => ctrans('texts.taxes')]; $data['$line_tax_values'] = ['value' => $this->lineTaxValues(), 'label' => ctrans('texts.taxes')]; $data['$date'] = ['value' => $this->translateDate($this->entity->date, $this->client->date_format(), $this->client->locale()) ?: ' ', 'label' => ctrans('texts.date')]; $data['$status_logo'] = ['value' => ' ', 'label' => ' ']; + $data['$delivery_note'] = ['value' => ' ', 'label' => ctrans('texts.delivery_note')]; + $data['$receipt'] = ['value' => ' ', 'label' => ctrans('texts.receipt')]; $data['$invoice.date'] = &$data['$date']; $data['$invoiceDate'] = &$data['$date']; diff --git a/app/Utils/PaymentHtmlEngine.php b/app/Utils/PaymentHtmlEngine.php index eaa8e902e413..b8cf29e4057d 100644 --- a/app/Utils/PaymentHtmlEngine.php +++ b/app/Utils/PaymentHtmlEngine.php @@ -175,16 +175,28 @@ class PaymentHtmlEngine $data['$invoices'] = ['value' => $this->formatInvoices(), 'label' => ctrans('texts.invoices')]; $data['$invoice_references'] = ['value' => $this->formatInvoiceReferences(), 'label' => ctrans('texts.invoices')]; - $data['$invoice'] = ['value' => $this->formatInvoice(), 'label' => ctrans('texts.invoices')]; + $data['$invoice'] = ['value' => $this->formatInvoice(), 'label' => ctrans('texts.invoice')]; $data['$invoice.po_number'] = ['value' => $this->formatPoNumber(), 'label' => ctrans('texts.po_number')]; $data['$poNumber'] = &$data['$invoice.po_number']; $data['$payment.status'] = ['value' => $this->payment->stringStatus($this->payment->status_id), 'label' => ctrans('texts.payment_status')]; $data['$invoices.amount'] = ['value' => $this->formatInvoiceField('amount'), 'label' => ctrans('texts.invoices')]; + $data['$amount_paid'] = ['value' => '', 'label' => ctrans('texts.amount_paid')]; + $data['$invoices.balance'] = ['value' => $this->formatInvoiceField('balance'), 'label' => ctrans('texts.invoices')]; $data['$invoices.due_date'] = ['value' => $this->formatInvoiceField('due_date'), 'label' => ctrans('texts.invoices')]; $data['$invoices.po_number'] = ['value' => $this->formatInvoiceField('po_number'), 'label' => ctrans('texts.invoices')]; - - + $data['$date'] = ['value' => '', 'label' => ctrans('texts.date')]; + $data['$method'] = ['value' => '', 'label' => ctrans('texts.method')]; + $data['$transaction_reference'] = ['value' => '', 'label' => ctrans('texts.transaction_reference')]; + $data['$public_notes'] = ['value' => $this->client->public_notes, 'label' => ctrans('texts.public_notes')]; + $data['$receipt'] = ['value' => '', 'label' => ctrans('texts.receipt')]; + $data['$amount_paid'] = ['value' => '', 'label' => ctrans('texts.amount_paid')]; + $data['$refund'] = ['value' => '', 'label' => ctrans('texts.refund')]; + $data['$refunded'] = ['value' => '', 'label' => ctrans('texts.refunded')]; + $data['$reference'] = ['value' => '', 'label' => ctrans('texts.reference')]; + $data['$total'] = ['value' => '', 'label' => ctrans('texts.total')]; + $data['$history'] = ['value' => '', 'label' => ctrans('texts.history')]; + if ($this->payment->status_id == 4) { $data['$status_logo'] = ['value' => '
' . ctrans('texts.paid') .'
', 'label' => '']; } else { diff --git a/lang/en/texts.php b/lang/en/texts.php index 719df08a74c9..b6fa671f24cf 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -5216,7 +5216,8 @@ $LANG = [ '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', ]; return $LANG; From 9bfab816fbe06f80e869347217edb9d9abcff486 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 28 Nov 2023 11:52:07 +1100 Subject: [PATCH 7/7] minor fixes for checking vendor notifications --- app/Jobs/Client/UpdateTaxData.php | 4 ++-- app/Jobs/Expense/VendorExpenseNotify.php | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/Jobs/Client/UpdateTaxData.php b/app/Jobs/Client/UpdateTaxData.php index c27733c06683..3f83bb38ab1e 100644 --- a/app/Jobs/Client/UpdateTaxData.php +++ b/app/Jobs/Client/UpdateTaxData.php @@ -63,8 +63,8 @@ class UpdateTaxData implements ShouldQueue if (!$this->client->state && $this->client->postal_code) { - $this->client->state = USStates::getState($this->client->postal_code); - $this->client->saveQuietly(); + $this->client->update(['state' => USStates::getState($this->client->postal_code)]); + // $this->client->saveQuietly(); } diff --git a/app/Jobs/Expense/VendorExpenseNotify.php b/app/Jobs/Expense/VendorExpenseNotify.php index 805bb5dfe731..c225910f8f6b 100644 --- a/app/Jobs/Expense/VendorExpenseNotify.php +++ b/app/Jobs/Expense/VendorExpenseNotify.php @@ -41,6 +41,9 @@ class VendorExpenseNotify implements ShouldQueue { MultiDB::setDB($this->db); + if(!$this->expense->vendor) + return; + $this->expense->vendor->contacts->filter(function (VendorContact $contact) { return $contact->send_email && $contact->email; })->each(function (VendorContact $contact) {